簡體   English   中英

如何禁用 MySQL 中的觸發器?

[英]How to disable triggers in MySQL?

在我的 MySQL 數據庫中,我有一些觸發器ON DELETEON 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 的回答指出了一個稍微不同的解決方案(對我來說更方便/更靈活)。

  1. 創建一個存儲要禁用的觸發器名稱的表。
  2. 然后在該表中放置一個觸發器名稱以禁用它。
  3. 在執行任何操作之前,請在該表中對其名稱進行觸發器檢查。

例如:

  1. create table Disabled_Triggers (TriggerName varchar(500) not null);

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM