postgresql 删除触发器_如何在postgresql中以弹性方式删除触发器

你可以尝试ALTER TABLE … DISABLE TRIGGER – 但它需要相同的锁定强度,所以我认为它对你没有多大帮助.

在Postgresql 9.4中有一些工作可以使ALTER TABLE对某些操作采用较弱的锁.这可能对此有所帮助.

与此同时,我创建或替换功能以使用简单的无操作功能替换触发器.

然后,为了实际删除触发器,我可能会编写一个脚本:

BEGIN;

LOCK TABLE the_table IN ACCESS EXCLUSIVE MODE NOWAIT;

DROP TRIGGER ...;

COMMIT;

如果有人使用该表,脚本将在LOCK TABLE中止.

然后我会循环运行它,直到它成功.

如果这不起作用(如果表总是忙)但是如果大多数事务都很短,我可能会尝试没有NOWAIT的LOCK TABLE,但设置一个简短的statement_timeout.所以脚本将是这样的:

BEGIN;

SET LOCAL statement_timeout = '5s';

LOCK TABLE the_table IN ACCESS EXCLUSIVE MODE NOWAIT;

DROP TRIGGER ...;

COMMIT;

如果无法及时完成工作,这可以确保在短时间内中断.再次,我会定期运行它,直到它成功.

如果这两种方法都没有效果 – 比如说,由于很多长时间的交易 – 我可能只是接受了将其锁定一段时间的需要.我启动了drop触发器然后我pg_terminate_backend所有持有表锁的并发事务,因此它们的连接被丢弃并且它们的事务终止了.这会让掉落触发器迅速发生,代价是更大的中断.如果您的应用程序编写得很好,您只能考虑这样的方法,这样他们就可以在连接丢失等瞬态错误上重试事务.

另一种可能的方法是通过直接修改系统目录来禁用(不丢弃)触发器.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值