修改 MySQL 触发器的正确方法是什么?
What is the right way to modify a MySQL trigger?
您可能知道,没有语法可以修改 MySQL 触发器。
为此,您需要执行 DROP TRIGGER,然后使用新定义重新创建它。
考虑以下因素,right/best 这样做的方法是什么:
- 您不能将这两个语句封装在事务中,因为那将毫无意义(DROP TRIGGER 和 CREATE TRIGGER 都调用隐式事务)
- 您不能使用 LOCK TABLES READ,因为会触发错误
- 就在您的 DROP 和 CREATE TRIGGER 之间,一些其他会话可能 insert/update/delete 行,您的新触发器和旧触发器都不会处理这些行。
在发布之前进行测试时,我忽略了我正在获取的 LOCK 类型,它是 READ。
所以似乎使用 WRITE 锁可以完成工作:
delimiter $$
LOCK TABLES table1 WRITE $$
DROP TRIGGER IF EXISTS after_insert_on_table1 $$
CREATE TRIGGER after_insert_on_table1 AFTER INSERT ON table1
FOR EACH ROW
BEGIN
...
END
$$
UNLOCK TABLES $$
delimiter ;
所以我的建议是在 updating/modifying 触发时始终使用此序列。
您可能知道,没有语法可以修改 MySQL 触发器。
为此,您需要执行 DROP TRIGGER,然后使用新定义重新创建它。
考虑以下因素,right/best 这样做的方法是什么:
- 您不能将这两个语句封装在事务中,因为那将毫无意义(DROP TRIGGER 和 CREATE TRIGGER 都调用隐式事务)
- 您不能使用 LOCK TABLES READ,因为会触发错误
- 就在您的 DROP 和 CREATE TRIGGER 之间,一些其他会话可能 insert/update/delete 行,您的新触发器和旧触发器都不会处理这些行。
在发布之前进行测试时,我忽略了我正在获取的 LOCK 类型,它是 READ。
所以似乎使用 WRITE 锁可以完成工作:
delimiter $$
LOCK TABLES table1 WRITE $$
DROP TRIGGER IF EXISTS after_insert_on_table1 $$
CREATE TRIGGER after_insert_on_table1 AFTER INSERT ON table1
FOR EACH ROW
BEGIN
...
END
$$
UNLOCK TABLES $$
delimiter ;
所以我的建议是在 updating/modifying 触发时始终使用此序列。