【发布时间】:2016-06-16 20:30:23
【问题描述】:
问题:如何从我的开发系统导出数据库内容(包括触发器)并将数据导入实时服务器,而不会在触发触发器时遇到错误 1449?
在最近的一个 php 项目中,我广泛使用了 mysql 触发器,但在将我的数据库从 dev 部署到 live 系统时遇到了问题。
例如我的触发器之一定义如下(使用mysqldump生成的输出)
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER update_template BEFORE UPDATE ON template
FOR EACH ROW BEGIN
SET new.mod_date := now();
END */;;
DELIMITER ;
该触发器是在我的开发系统上使用用户 root@localhost 定义的,该用户在上述语句中创建了 DEFINER=root@localhost 子句。
root@localhost 作为实时服务器上的用户不存在,这会在实时系统用户触发触发器(例如,通过使用 update templates set...)时导致以下错误
1449: 指定为定义者的用户('root'@'localhost') 不存在
目前我使用mysqldump --add-drop-table --user=root -p my_project > export.sql 用于导出,mysql -u devuser -p my_project < export.sql 用于导入数据。
导出/导入完美无缺。只有当我通过 sql 操作数据并涉及触发器时才会出现该错误。
编辑:
MySQL 版本是 5.5.47(live 和 dev)
【问题讨论】:
-
MySQL 使用什么版本?从 MySQL 5.7.8 版本开始,您可以使用
--skip-definer。 -
感谢您的提示,不幸的是,这对我来说不是一个选项,但已将其添加到 stackoverflow.com/questions/9446783/…