是否可以在MySQL中修改现有的触发器定义?


14

我想知道是否有可能在MySQL中更新触发器定义。例如,我有一个触发器T,我想为其添加一些新功能。

我的假设是我需要删除并重新创建它。

在这种情况下,数据库管理中的最佳实践是什么?


Alex,您是否查看过MySQL文档中的触发器定义?说了什么 您不确定哪个部分,或者在尝试实现这些问题时会导致问题?
迈克尔·格林

如果可以更新触发器,则在MySQL文档中找不到任何信息。我认为这是不可能的,我想再次检查。
亚历克斯(Alex)

Answers:


19

听起来您好像在问是否可以在原子操作中更改触发器,在这种情况下,如果新定义失败,您就不会失去旧的...类似于CREATE OR REPLACE VIEW,如果新定义将替换视图定义,是有效的,但如果您不能替换旧的,则保留旧的。

不幸的是,没有ALTER TRIGGERCREATE OR REPLACE TRIGGER在MySQL。

我建议最好的做法是将表锁定在触发器所在的位置,因此没有行将不会受到触发器的影响。允许在表锁定时删除和添加触发器。

mysql> LOCK TABLES t1 WRITE; -- the next prompt appears once you've obtained the lock
mysql> DROP TRIGGER t1_bi; 
mysql> DELIMITER $$
mysql> CREATE TRIGGER ti_bi BEFORE INSERT ON t1 FOR EACH ROW 
       BEGIN
       ...
       END $$
mysql> DELIMITER ;
mysql> UNLOCK TABLES;

更新:在10.1.4版中的MariaDB,CREATE OR REPLACE TRIGGER为其对MySQL的直接替代添加了支持。

https://mariadb.com/kb/zh-CN/mariadb/create-trigger/

从5.7开始,Oracle的MySQL仍依赖于上述解决方案。


2
“ Oracle 5.7以上的MySQL仍然依赖于上述解决方案” – 8.0版中仍然如此
Paul Campbell,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.