如何批量更改MySQL触发器DEFINER

nei*_*ldt 18 mysql triggers

我一直在研究我们的内部开发服务器并在我们的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)

  • 这仅适用于某些环境.不适用于centOS上的社区5.5.36 ......"mysqldump:未知选项' - add-drop-trigger'" (4认同)
  • 我必须删除“--skip-opt”才能使其正常工作。只是如果有人偶然发现这一点。但非常有用的答案,并且在 2021 年仍然有效。 (2认同)

Dav*_*ber 6

运行此 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)

然后修改结果并执行。

  • 实际上它不是表名而是数据库名。 (2认同)