我一直在研究我们的内部开发服务器并在我们的MySQL 5.6.13服务器上创建MySQL触发器.我现在遇到的问题是在内部服务器上使用as DEFINER = root@ 创建了触发器(总共大约200个)%.
现在我想转移到实时生产服务器.但是在我们的实时服务器上,我们不允许用户root访问.因此,我如何批量更改所有触发器,以便它读取DEFINER = root@localhost
pet*_*erm 52
一种方法:
1)将触发器定义转储到文件中
# mysqldump -uroot -p --triggers --add-drop-trigger --no-create-info \
--no-data --no-create-db --skip-opt test > /tmp/triggers.sql
Run Code Online (Sandbox Code Playgroud)
2)triggers.sql在您喜欢的编辑器中打开文件并使用Find and Replace功能更改DEFINERs.保存更新的文件.
3)从文件重新创建触发器
# mysql < triggers.sql
Run Code Online (Sandbox Code Playgroud)
运行此 sql 语句(将表名和触发器名替换为所需的触发器):
SELECT CONCAT('DROP TRIGGER IF EXISTS `', trigger_name, '`;', CHAR(13), 'DELIMITER $$', CHAR(13), 'CREATE TRIGGER `', TRIGGER_NAME, '` ', ACTION_TIMING, ' ', EVENT_MANIPULATION, ' ON ', EVENT_OBJECT_SCHEMA, '.', EVENT_OBJECT_TABLE, ' FOR EACH ROW ', ACTION_STATEMENT, '$$', CHAR(13), 'DELIMITER ;') AS command
FROM information_schema.triggers
WHERE EVENT_OBJECT_SCHEMA = 'tablename'
AND TRIGGER_NAME = 'triggername';
Run Code Online (Sandbox Code Playgroud)
然后修改结果并执行。