Mysql

是否可以修改 MySQL 中現有的觸發器定義?

  • June 23, 2021

我想知道是否可以在 MySQL 中更新觸發器定義。例如,我有一個觸發器 T,我想向它添加一些新功能。

我的假設是我需要刪除並重新創建它。

對於這種情況,數據庫管理的最佳實踐是什麼?

聽起來您在問是否可以在原子操作中更改觸發器,如果新定義失敗,您不會失去舊定義…類似於CREATE OR REPLACE VIEW,如果新定義將替換視圖定義是有效的,但如果您無法更換舊的,則將其留在原處。

不幸的是,MySQL 中沒有ALTER TRIGGERor CREATE OR REPLACE TRIGGER

我建議最好的做法是鎖定觸發器所在的表,因此沒有觸發器會影響任何行。允許在表被鎖定時刪除和添加觸發器。

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;

更新:MariaDB 在 10.1.4 版本中增加CREATE OR REPLACE TRIGGER了對 MySQL 的替代品的支持。

https://mariadb.com/kb/en/mariadb/create-trigger/

Oracle 5.7 的 MySQL 仍然依賴於上述解決方案。

引用自:https://dba.stackexchange.com/questions/78438