我需要修改已经定义的触发器(使用特定的FUNCTION)并且它正在使用中。如果我使用CREATE或REPLACE FUNCTION修改它,Postgres的行为是什么?它会在更新函数时“暂停”旧触发器吗?据我所知,Postgres应该在一个事务中执行所有REPLACE FUNCTION(因此表被锁定,因此触发器在更新时被修改,然后锁定的下一个事务将使用新的FUNCTION而不是旧的.FUNCTION是正确的。 ?
答案 0 :(得分:1)
是。根据文件:
http://www.postgresql.org/docs/9.0/static/explicit-locking.html
此外,大多数PostgreSQL命令会自动获取适当模式的锁,以确保在命令执行时不会以不兼容的方式删除或修改引用的表。 (例如,ALTER TABLE无法安全地与同一个表上的其他操作同时执行,因此它会在表上获得一个独占锁来强制执行该操作。)
答案 1 :(得分:1)
它会在更新函数时“暂停”旧触发器吗?
当调用正在进行时,它应该继续执行旧的触发器函数(取决于隔离级别,同一事务中的后续调用也应该使用旧的定义;我不是100%确定默认级别会这样做,但是,阻止尝试在更新时调用函数的新事务,并在替换后执行新函数。
据我所知,Postgres应该在一个事务中执行所有REPLACE FUNCTION(因此表被锁定,因此触发器在更新时被修改,然后锁定的下一个事务将使用新的FUNCTION而不是旧的。这是对的吗?
最好我知道与触发器关联的功能在更新时不会锁定表。
请大家多说:上面的两个陈述相当于我直截了当地期待mvcc做的事情,而不是知道Postgres的源代码区域。 (一些核心贡献者定期来到SO,最终可能会更准确地回答。)
请注意,这是相对简单的测试,即说:打开两个psql会话,打开两个事务,看看会发生什么......