如何仅在一个事务中禁用PostgreSQL触发器?

时间:2016-06-09 15:54:59

标签: database postgresql triggers postgresql-9.5

我需要在事务中临时禁用一个PostgreSQL触发器,但没有硬件锁定表。有人知道是否可能吗?

这样的事情没有锁定表,并且在此事务之外禁用触发器。

BEGIN TRANSACTION;

  ALTER TABLE foo DISABLE TRIGGER bar;

  -- DO SOME UPDATES ON foo
  UPDATE foo set field = 'value' where field = 'test';

  ALTER TABLE foo ENABLE TRIGGER bar;

COMMIT;

3 个答案:

答案 0 :(得分:7)

要暂时禁用PostgreSQL会话中的所有触发器,请使用:

SET session_replication_role = replica;

仅禁用当前数据库会话的所有触发器。对于批量操作很有用,但请记住要小心保持数据库的一致性。

重新启用:

SET session_replication_role = DEFAULT;

来源:http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/

答案 1 :(得分:2)

您可以在此表中停用所有触发器。它应该是这样的:

ALTER TABLE tblname DISABLE TRIGGER USER;
Your SQL;
ALTER TABLE tblname ENABLE TRIGGER USER;

要禁用单个触发器,请使用以下命令:

ALTER TABLE tblname DISABLE TRIGGER trigger_name;
Your SQL;
ALTER TABLE tblname ENABLE TRIGGER trigger_name;

您可以在文档中阅读有关ALTER TABLE的更多信息。

答案 2 :(得分:2)

我也遇到了同样的问题,并找到了解决问题的灵巧,干净的方法。

首先,如果当前正在执行的触发器是 触发器,则不能禁用该触发器。那是我的情况-由于要插入表而将其插入到表中-否则将导致触发器无限循环。

我解决的方法是在混合中添加一个本地参数变量,该变量本质上充当全局变量,当触发器已经被使用时,它将阻止触发器的进一步调用。

为此,请从一开始就将以下代码添加到触发函数中:

SET LOCAL your.variable_name to 'TRUE';

然后(假设您使用的pg≥9.6),您可以将以下行添加到CREATE TRIGGER中:

WHEN (current_setting('your.variable_name', 't') <> 'TRUE')

我还没有做过任何基准测试,但是根据我以前的经验,我希望它表现出色。