
drop trigger <triggername> on <tablename>
它造成巨大的桌锁,一切都冻结了!
触发器的作用是:
插入或更新行时,检查字段的内容,拆分它并填充另一个表.
我应该如何在不造成生产环境麻烦的情况下立即禁用(并在之后删除)?
提前致谢,对不起我的英文;)
你可以尝试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所有持有表锁的并发事务,因此它们的连接被丢弃并且它们的事务终止了.这会让掉落触发器迅速发生,代价是更大的中断.如果您的应用程序编写得很好,您只能考虑这样的方法,这样他们就可以在连接丢失等瞬态错误上重试事务.
另一种可能的方法是通过直接修改系统目录来禁用(不丢弃)触发器.
总结以上是内存溢出为你收集整理的如何在postgresql中以d性方式删除触发器全部内容,希望文章能够帮你解决如何在postgresql中以d性方式删除触发器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)