PostgreSQL 表约束后触发

问题描述 投票:0回答:1

在 PostgreSQL 中,我不确定我是否理解后触发:

  • AFTER insert or update FOR EACH STATEMENT
    触发器(函数)中,如果我查询触发器的表,我会在对表应用任何更改之前看到数据,这是否正确(与例如MSSQL相反)?

  • 并且,如果这是正确的,我如何对整个表强制实施约束(例如,某些列的总和不超过某个值,或者最多 N 条记录将某些布尔列设置为是真的,等等)?

我能够设计的唯一方法是查询将其与已删除和插入的记录连接起来的表,以便恢复语句之后的数据,但我是 PG 的新手,这似乎有点太多了为这样一个共同的要求而工作。 我尝试阅读文档并搜索网络,但我找不到上述问题的明确答案,实际上甚至没有示例。

感谢您的任何澄清/建议。

postgresql triggers constraints
1个回答
0
投票
AFTER

触发器中,您已经看到触发语句的效果。

但这对您没有帮助:您无法在触发器中可靠地对整个表强制实施约束

,因为您看不到来自并发事务的未提交数据

。因此,使用触发器来强制执行此类约束总是存在竞争条件,除非您使用以下补救措施之一

    使用
  • SERIALIZABEL

    隔离级别

    
    

  • 使用重度锁定来防止并发事务
  • 请参阅
本文

了解更详细的解释。

© www.soinside.com 2019 - 2024. All rights reserved.