我有一个postgres表,其中包含一些触发器,如果记录被覆盖或删除,这些触发器将触发。它们基本上是归档记录,因此不会被删除-它们只是更改某些属性,因此记录不会显示在相应的视图中。
有时我想永久删除一条记录,但是我不能这样做,因为触发器会触发并且执行我的DELETE查询就可以了。
示例:
DELETE FROM records WHERE operator = 20
是否可以运行DELETE查询并绕过在DELETE上触发的触发器?
答案 0 :(得分:1)
使用这样的设置,我认为典型的方法是避免在基础表上授予任何直接特权,并将INSERT
/ UPDATE
/ DELETE
触发器放在视图上(允许表所有者根据需要进行更改)。
如果您是表所有者,则可以使用ALTER TABLE
临时DISABLE
并重新ENABLE
触发器。只要您在事务中完成所有这些操作,就可以安全地防止并发DELETE
并发,尽管它们会阻塞直到您的事务提交。
如果您具有超级用户特权,还可以通过将session_replication_role
设置为replica
来阻止触发触发器,前提是尚未将相关触发器配置为在复制数据库上触发。