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

How to disable PostgreSQL triggers in one transaction only?

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

没有锁定 table 和禁用此事务之外的触发器的情况。

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;

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

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 的更多信息。

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

SET session_replication_role = replica;

这只会禁用当前数据库会话的所有触发器。对批量操作很有用,但要注意保持数据库的一致性。

至re-enable:

SET session_replication_role = DEFAULT;

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

我遇到了完全相同的问题,想出了一个聪明而干净的方法来解决它。

首先,如果触发器是您当前正在执行的触发器,则您无法在内部禁用触发器。那是我的场景 - 我正在插入 table 作为插入的结果 - 否则会导致无限循环的触发器。

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

为此,将以下代码添加到您的触发器函数中,在最开始处:

SET LOCAL your.variable_name to 'TRUE';

然后(假设您使用的是 pg ≥ 9.6)您只需将以下行添加到您的 CREATE TRIGGER:

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

我没有做过任何基准测试,但根据我以前的经验,我希望它的性能非常好。