Magento 2.3.7后台操作产品报SQLSTATE[HY000] 1449错误如何解决?
Magento 2.3.7 产品操作触发SQL 1449 definer不存在报错解决方案
报错原因
该错误由数据库对象的定义者权限不匹配导致:你当前使用的Magento数据库中,触发器、视图或存储过程创建时绑定的定义者(definer)用户maribuco_gzq7omh@localhost在当前共享服务器的数据库环境中不存在,当产品更新操作触发mg21_catalog_product_entity表上的关联触发器时就会抛出该错误。
适配共享服务器的可行解决方案
快速临时修复(优先解决产品操作问题)
先单独修复产品表关联的触发器definer:
- 登录数据库管理工具(如phpMyAdmin),进入Magento对应数据库,执行SQL查询所有产品表关联触发器:
SELECT DEFINER,TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = '替换为你的数据库名' AND EVENT_OBJECT_TABLE = 'mg21_catalog_product_entity';
- 替换触发器的definer为你当前Magento使用的数据库用户名(可在
app/etc/env.php的db.connection.default.username字段中查询到,下文中统一称为当前数据库用户名),示例执行语句:
DELIMITER ;; DROP TRIGGER IF EXISTS 上一步查询得到的触发器名;; CREATE DEFINER=`当前数据库用户名`@`localhost` TRIGGER 触发器名 原触发器执行逻辑;; DELIMITER ;
修改完成后即可正常执行产品创建、修改操作。
全量修复(避免后续其他操作触发同类报错)
批量替换数据库中所有触发器、视图的definer为当前使用的用户:
- 批量生成所有触发器的修改语句,执行后复制结果逐一运行即可:
SELECT CONCAT('DROP TRIGGER IF EXISTS ', TRIGGER_NAME, '; CREATE DEFINER=`当前数据库用户名`@`localhost` TRIGGER ', TRIGGER_NAME, ' ', ACTION_TIMING, ' ', EVENT_MANIPULATION, ' ON ', EVENT_OBJECT_TABLE, ' FOR EACH ROW ', ACTION_STATEMENT, ';') AS create_trigger_sql FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = '替换为你的数据库名';
- 批量生成所有视图的修改语句,执行后复制结果逐一运行即可:
SELECT CONCAT("ALTER DEFINER=`当前数据库用户名`@`localhost` VIEW ", TABLE_NAME, " AS ", VIEW_DEFINITION, ";") AS alter_view_sql FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '替换为你的数据库名';
方案2:直接创建缺失的definer用户
如果你的共享服务器允许创建自定义数据库用户,可直接在数据库管理面板(如cPanel的MySQL管理页)创建用户maribuco_gzq7omh,主机设置为localhost,给该用户授予当前Magento数据库的全部读写权限即可解决问题。
避坑提示
后续迁移Magento数据库导出备份时,添加--skip-definer参数可自动忽略所有definer定义,避免再次出现同类报错,导出命令示例:
mysqldump -u用户名 -p 数据库名 --skip-definer > magento_backup.sql
内容的提问来源于stack exchange,提问作者MartiPE
相关产品推荐
相关产品推荐

