如何仅在一个事务中禁用 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')
我没有做过任何基准测试,但根据我以前的经验,我希望它的性能非常好。
我需要在一个事务中临时禁用一个 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')
我没有做过任何基准测试,但根据我以前的经验,我希望它的性能非常好。