如何在MySQL中禁用触发器?

38

在我的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
一个简单的解决方法是改用自定义的会话变量。

#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') 

这里解释了如何按需禁用/启用触发器的技巧


1
当在例如PHP中执行代码时,如果用户定义的会话变量不存在会发生什么?它会将其视为false "FALSE"还是会出现变量不存在类型的错误消息? - TenG
我发现在[https://dev59.com/IHA65IYBdhLWcg3w4C-j]上发布的答案非常有帮助,特别是关于`SET @disable_trigger = NULL;`和相应条件语句的部分。 - w. Patrick Gale
我发现在https://stackoverflow.com/questions/3577528/make-a-query-in-mysql-without-invoking-a-trigger-how-to-disable-a-trigger上发布的答案非常有帮助,特别是关于SET @disable_trigger = NULL;和相应的条件语句。 - undefined
2个回答

17

无法暂时禁用触发器。可以使用一个全局变量, 触发器首先会检查全局变量的值,因此您可以更改全局变量的值以防止触发器工作。


2
如何创建全局变量? - adinas
为什么暂时禁用触发器不可行? - aagjalpankaj

4

@Fathah's的回答指向了一个稍微不同的解决方案(对我来说更加方便/灵活)。

  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 时触发器不会执行任何操作。这解决了我来到这里的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接