Postgres - 触发后删除记录
Postgres - delete record after trigger
我有一个带有一些触发器的 postgres table,如果记录被更新或删除,这些触发器就会触发。他们基本上将记录存档,因此它们不会被真正删除——他们只是更改某些属性,因此记录不会显示在相应的视图中。
有时我想手动永久删除一条记录,但我做不到,因为触发器会触发,如果我执行 DELETE 查询,它就会执行。
示例:
DELETE FROM records WHERE operator = 20
有没有办法 运行 DELETE 查询并绕过在 DELETE 时触发的触发器?
对于这样的设置,我认为典型的方法是避免授予对底层 table 的任何直接特权,并将您的 INSERT
/ UPDATE
/ DELETE
在视图上触发(允许 table 所有者根据需要更改它)。
如果您是table所有者,您可以使用ALTER TABLE
暂时DISABLE
并重新ENABLE
触发。只要您在一个事务中执行所有这些操作,您就可以安全地防止并发 DELETE
s,尽管它们会阻塞直到您的事务提交。
如果您拥有超级用户权限,您还可以通过将 session_replication_role
设置为 replica
来防止触发器触发,前提是相关触发器尚未配置为在复制数据库上触发。
我有一个带有一些触发器的 postgres table,如果记录被更新或删除,这些触发器就会触发。他们基本上将记录存档,因此它们不会被真正删除——他们只是更改某些属性,因此记录不会显示在相应的视图中。
有时我想手动永久删除一条记录,但我做不到,因为触发器会触发,如果我执行 DELETE 查询,它就会执行。
示例:
DELETE FROM records WHERE operator = 20
有没有办法 运行 DELETE 查询并绕过在 DELETE 时触发的触发器?
对于这样的设置,我认为典型的方法是避免授予对底层 table 的任何直接特权,并将您的 INSERT
/ UPDATE
/ DELETE
在视图上触发(允许 table 所有者根据需要更改它)。
如果您是table所有者,您可以使用ALTER TABLE
暂时DISABLE
并重新ENABLE
触发。只要您在一个事务中执行所有这些操作,您就可以安全地防止并发 DELETE
s,尽管它们会阻塞直到您的事务提交。
如果您拥有超级用户权限,您还可以通过将 session_replication_role
设置为 replica
来防止触发器触发,前提是相关触发器尚未配置为在复制数据库上触发。