MySQL禁用所有触发器。

24

为了测试查询的正确性,我需要在数据库中禁用所有触发器。 我看到information_schema中存在TRIGGERS表。 是否可以使用此表暂时禁用所有触发器? 例如:

update TRIGGERS set TRIGGERS_SCHEMA='myschema_new' 
where TRIGGERS_SCHEMA='myschema'

完成所有测试后,返回所有触发器,如下所示:

update TRIGGERS set TRIGGERS_SCHEMA='myschema'
where TRIGGERS_SCHEMA='myschema_new'

也许这会损坏数据库或触发器将无法起作用?我在文档中没有找到相关内容。


4
information_schema 表无法被修改,因为它们实际上是视图。参考链接:http://dev.mysql.com/doc/refman/5.1/en/information-schema.html。 - Joel B Fant
@Joel B Fant - +1 我不知道呢。谢谢分享。 :) - Francois Deschenes
2个回答

38

您不能直接禁用触发器,我不建议您采取您建议的操作,但是您可以让触发器在执行其内容之前检查一个变量(在我的示例中为@disable_triggers)是否为NULL。例如:

查询:

SET @disable_triggers = 1;
// Your update statement goes here.
SET @disable_triggers = NULL;

触发器:

IF @disable_triggers IS NULL THEN
    // Do something use as the trigger isn't disabled.
END IF;

8
我有近1000个触发器 - 这让按照您的建议去做变得非常困难。 - Lorenzo Manucci
@Lorenzo Manucci - 很抱歉,MySQL 没有禁用或启用触发器的方法。如果您需要经常执行此操作,则应重新创建所有触发器;如果它们无法正常工作,则应重新创建它们。我并不完全相信修改 information_schema 数据库是一个好主意,但如果它解决了您的问题,并且这只是一次性的事情,请备份所有数据库并继续进行。 - Francois Deschenes
使用 SELECT @disable_triggers; 检查当前值。 - user427969
@LorenzoManucci 我写了一个生成脚本。实际上我也有类似这样的代码:IF (@DISABLE_ALL_TRIGGERS IS NULL AND @DISABLE_TRIGGER_MOST_YOUR_SPECIFIC_TRIGGER IS NULL) THEN - Tob

0
"

在MySQL中不可能'禁用'触发器,但是有一个可以解决这个问题的技巧

在你的触发器中添加条件:

"
if (DISABLE_TRIGER <> 1 ) then 
#trigger body 
end if; 

如果你想在导入时禁用触发器,只需执行以下操作:

SET @DISABLE_TRIGER = 1;

然后再进行导入操作即可。

SET @DISABLE_TRIGER = 0;

而且我不能更改触发器的代码,因为我不是作者 - 这些触发器将由另一个人修复,因为它们工作不正确,但我需要完成我的工作 - 测试所有插入查询。 - Lorenzo Manucci

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