我需要在事务中临时禁用一个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;
答案 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')
我还没有做过任何基准测试,但是根据我以前的经验,我希望它表现出色。