修改Postgresql中的触发器

时间:2013-12-09 21:37:05

标签: postgresql triggers

我需要修改已经定义的触发器(使用特定的FUNCTION)并且它正在使用中。如果我使用CREATE或REPLACE FUNCTION修改它,Postgres的行为是什么?它会在更新函数时“暂停”旧触发器吗?据我所知,Postgres应该在一个事务中执行所有REPLACE FUNCTION(因此表被锁定,因此触发器在更新时被修改,然后锁定的下一个事务将使用新的FUNCTION而不是旧的.FUNCTION是正确的。 ?

2 个答案:

答案 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会话,打开两个事务,看看会发生什么......

相关问题