问题:如何从我的开发系统导出数据库内容(包括触发器)并将数据导入到实时服务器,而不会在触发触发器时遇到错误 1449?
在最近的一个 PHP 项目中,我广泛使用了 mysql 触发器,但在将数据库从开发部署到实时系统时遇到了问题。
例如我的触发器之一定义如下(使用 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: The user specified as a definer('root'@'localhost') does not exist
目前我使用mysqldump --add-drop-table --user=root -p my_project > export.sql
用于导出和 mysql -u devuser -p my_project < export.sql
用于导入数据。
导出/导入工作完美无缺。仅当我通过 sql 操作数据并且涉及触发器时才会出现该错误。
编辑:
MySQL 版本为 5.5.47(实时版和开发版)
最佳答案
导出到 export.sql
后,接下来您需要通过 sed 使用正则表达式清理触发行,如下所示:
sed -i -- 's/^..!50003\sCREATE.....!50017\sDEFINER=.root...[^
]*... ..!50003\s\([^;]*\)/CREATE DEFINER=CURRENT_USER\1/g;s/^\s*\([^\*]*;\{0,1\}\)\s\{0,1\}\*\/;;$/\1;;/g' 导出.sql
这适用于 Linux,但如果您使用的是 Mac OS X,则内置 sed 命令将不起作用。您需要首先 brew install gnu-sed
,然后在上述命令中使用 gsed 而不是 sed。
关于triggers - 对不同用户使用触发器(MySQL 错误 1449),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35773454/