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

标签 triggers mysql

问题:如何从我的开发系统导出数据库内容(包括触发器)并将数据导入到实时服务器,而不会在触发触发器时遇到错误 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/

相关文章:

postgresql - 检查值是否不等于选择查询时触发函数总是引发异常

php - 来自几个按 ASC 排序的 MySQL 表的数据

java - 调试MysqlDataTruncation异常

mysql - SQL 在插入后触发器中创建事件

java - 如何根据 1 Select 语句的结果有条件地发生 Mysql insert 语句

php - AWS MySQL 是否缓存数据?拉拉维尔 5

mysql - 使用MySQL计算结果中所有经纬度距离

sql - 在字段中使用 (-)

version-control - Jenkins 构建如何区分 SCM 触发的构建和用户请求的构建?

c# - 使用 SMO 或 Linq 的 SQL Server CLR 触发器?