gpt4 book ai didi

triggers - 对不同用户使用触发器(MySQL 错误 1449)

转载 作者:行者123 更新时间:2023-11-29 02:51:03 26 4
gpt4 key购买 nike

问题如何从我的开发系统导出数据库内容(包括触发器)并将数据导入实时服务器,而不会在触发触发器时遇到错误 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 @ 定义的创建 DEFINER=root@localhost 的 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' export.sql

这适用于 Linux,但如果您使用的是 Mac OS X,则内置的 sed 命令将不起作用。您需要先brew install gnu-sed,然后在上述命令中使用gsed 代替sed

关于triggers - 对不同用户使用触发器(MySQL 错误 1449),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35773454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com