我正在推出一些软件的更新,其中包括运行SQL脚本来创建触发器。
在我的.sql
文件语法中,我没有包含任何DEFINER子句,因为我希望我的客户的生产MySQL用户(他们自己设置)能够在程序运行时执行这些触发器。
事实是,测试显示MySQL使用'CURRENT_USER'@'%'
自动为TRIGGER创建一个DEFINER。
当你做了明智的事情,并使用(受限制的)帐户进行日常数据操作而另一个用于大更新(root?)时,你最终会尝试与一个或多个没有权限的用户一起执行TRIGGER这样做。
有没有办法删除这个“自动添加定义器”功能?
我尝试输入DEFINER = '%'@'%'
,但这不被接受。
答案 0 :(得分:1)
如果您使用的是* 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