【问题标题】:Postgres - delete record after triggerPostgres - 触发后删除记录
【发布时间】:2019-02-21 09:39:25
【问题描述】:

我有一个带有一些触发器的 postgres 表,如果记录被更新或删除,就会触发这些触发器。他们基本上将记录存档,因此不会被真正删除 - 他们只是更改某些属性,因此记录不会显示在相应的视图中。

有时我想手动删除一条记录,但我不能这样做,因为触发器会触发并且如果我执行 DELETE 查询就会这样做。

示例: DELETE FROM records WHERE operator = 20

有没有办法运行 DELETE 查询并绕过在 DELETE 上触发的触发器?

【问题讨论】:

    标签: postgresql database-trigger


    【解决方案1】:

    通过这样的设置,我认为典型的方法是避免授予基础表的任何直接权限,并将您的 INSERT / UPDATE / DELETE 触发器放在视图上(允许表所有者根据需要更改)。

    如果您是表所有者,您可以使用ALTER TABLE 临时DISABLE 和重新ENABLE 触发器。只要您在事务中执行所有这些操作,您就可以安全地避免并发 DELETEs,尽管它们会在您的事务提交之前阻塞。

    如果您拥有超级用户权限,还可以通过将session_replication_role 设置为replica 来阻止触发器触发,前提是相关触发器尚未配置为在复制数据库上触发。

    【讨论】:

    • 我认为禁用/启用触发方式是你想要的。也许您可以在较新的 PostgreSQL 版本中使用逻辑解码功能来写入审计日志(到单独的表中)——而无需一直触发代价高昂的触发器。这样您就可以毫不费力地从审计表中删除记录。
    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2019-11-07
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2012-04-11
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多