[英]How to disable triggers in MySQL?
在我的 MySQL 數據庫中,我有一些觸發器ON DELETE
和ON INSERT
。 有時我需要禁用一些觸發器,我必須DROP
例如
DROP TRIGGER IF EXISTS hostgroup_before_insert //
並重新安裝。 SET triggers hostgroup_before_insert = 0
是否有任何快捷方式,就像我們為外鍵設置的那樣:
mysql> SELECT version();
+-------------------------+
| version() |
+-------------------------+
| 5.1.61-0ubuntu0.10.10.1 |
+-------------------------+
1 row in set (0.00 sec)
編輯答案MySQL 中沒有內置服務器系統變量 TRIGGER_CHECKS 。
一個簡單的解決方法是改用用戶定義的 session 變量。
#FALSE value overrides trigger type settings
SET @TRIGGER_CHECKS = [TRUE|FALSE];
SET @TRIGGER_BEFORE_INSERT_CHECKS = [TRUE|FALSE];
SET @TRIGGER_AFTER_INSERT_CHECKS = [TRUE|FALSE];
DELIMITER $$
DROP TRIGGER IF EXISTS `yearCheck_beforeInsert` $$
CREATE DEFINER=`root`@`localhost` TRIGGER `yearCheck_beforeInsert`
BEFORE INSERT ON `movies` FOR EACH ROW
#Patch starts here
thisTrigger: BEGIN
IF ((@TRIGGER_CHECKS = FALSE)
OR (@TRIGGER_BEFORE_INSERT_CHECKS = FALSE))
AND (USER() = 'root@localhost')
這個TRICK 在這里解釋。
它不可能臨時禁用觸發器。 做一件事,使用一個全局變量。 觸發器將首先檢查全局變量的值。 在這種情況下,您可以更改全局變量的值以防止觸發器的工作。
@Fathah 的回答指出了一個稍微不同的解決方案(對我來說更方便/更靈活)。
例如:
create table Disabled_Triggers (TriggerName varchar(500) not null);
Insert into Disabled_Triggers(TriggerName) values ('trg_example');
CREATE TRIGGER trg_example AFTER UPDATE on Example_Table
FOR EACH ROW BEGIN
if not exists (select 1 from Disabled_Triggers where TriggerName = 'trg_example') THEN
...
END IF;
END;
現在,當觸發器名稱在 Disabled_Triggers 表中時,更新 Example_Table 時觸發器不會執行任何操作。 這解決了把我帶到這里的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.