Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql中的修改触发器_Postgresql_Triggers - Fatal编程技术网

Postgresql中的修改触发器

Postgresql中的修改触发器,postgresql,triggers,Postgresql,Triggers,我需要修改一个已经定义并且正在使用的触发器(使用特定函数)。如果我使用CREATE或REPLACE函数修改它,Postgres的行为是什么?在更新功能时,是否会“暂停”旧触发器?。据我所知,Postgres应该在一个事务中执行所有的REPLACE函数(因此表被锁定,触发器在更新时被修改,然后下一个被锁定的事务将使用新函数而不是旧函数。是否正确?是。根据文档: 此外,大多数PostgreSQL命令会自动获取适当模式的锁,以确保在命令执行时不会以不兼容的方式删除或修改引用的表。(例如,ALTER

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

是。根据文档:

此外,大多数PostgreSQL命令会自动获取适当模式的锁,以确保在命令执行时不会以不兼容的方式删除或修改引用的表。(例如,ALTER TABLE无法安全地与同一表上的其他操作同时执行,因此它会获得表上的独占锁以强制执行该操作。)

在更新函数时,是否会“暂停”旧触发器

当调用正在进行时,它应该继续执行旧的触发器函数(取决于隔离级别,同一事务中的后续调用也应该使用旧的定义;但是,我不能100%确定默认级别会这样做),阻止在更新函数时尝试调用该函数的新事务,并在替换新函数后执行该函数

据我所知,Postgres应该在一个事务中执行所有的REPLACE函数(因此表被锁定,触发器在更新时被修改,那么下一个被锁定的事务将使用新函数而不是旧函数。这是否正确

据我所知,在更新表时,与触发器关联的函数不会锁定表

不过,请恕我直言:以上两条陈述相当于我直觉上期望mvcc所做的事情,而不是我头脑中的博士后源代码(一些核心贡献者会定期这样做,最终可能会给出更准确的答案)


请注意,这是一个相对简单的测试,也就是说:打开两个psql会话,打开两个事务,然后看看会发生什么…

如果我在受影响的表上也运行了一个复制系统,这会起作用吗?