8

我正在推出一些软件的更新,其中包括运行 SQL 脚本来创建触发器。

在我的.sql文件语法中,我没有包含任何 DEFINER 子句,因为我希望我的客户的生产 MySQL 用户(他们自己设置)能够在程序运行时执行这些触发器。

问题是,测试表明 MySQL 会自动为 TRIGGER 创建一个 DEFINER,使用'CURRENT_USER'@'%'. 当您做明智的事情并使用(受限)帐户进行日常数据操作并使用另一个帐户进行大更新(root ?)时,您最终会尝试使用一个或多个没有权限的用户执行 TRIGGER去做吧。

有没有办法删除这个“自动添加定义器”功能?

我尝试输入DEFINER = '%'@'%',但这不被接受。

4

1 回答 1

2

如果您在 *nix 平台上,则可以通过以下任一命令行脚本删除定义器。

cat database.sql | sed -e "s/DEFINER=[^*]*\*/\*/" > database_nodefiner.sql

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < oldfile.sql > newfile.sql

如果您的 database.sql 非常大,则不要先转储它然后删除定义器,而是在转储期间删除定义器。

mysqldump database | sed -e "s/DEFINER=[^*]*\*/\*/" > database_nodefiner.sql

于 2017-04-24T02:02:58.287 回答