2013-12-09 87 views
1

我需要修改已經定義的觸發器(它使用特定的功能)並且正在使用中。如果我使用CREATE或REPLACE FUNCTION修改它,Postgres的行爲是什麼?它會在更新函數時「暫停」舊觸發器嗎?據我所知,Postgres應該在一個事務中執行所有REPLACE FUNCTION(所以表被鎖定,所以觸發器在更新時被修改,然後下一個被鎖定的事務將使用新的FUNCTION而不是舊事務。 ?在Postgresql中修改觸發器

回答

1

是根據文檔:。
http://www.postgresql.org/docs/9.0/static/explicit-locking.html
此外,大多數的PostgreSQL命令自動獲取的適當模式的鎖,以確保引用的表中沒有不兼容的方式刪除或修改,而命令執行(例如, ALTER TABLE無法安全地與同一個表上的其他操作同時執行,因此它會在表上獲得排它鎖來強制執行該操作。)

+0

如果我還有一個在受影響的表上運行的複製系統,這項工作是否會進行? –

1

它會在更新函數時「暫停」舊觸發器嗎?

應該繼續執行舊的觸發功能,當呼叫過程中(取決於隔離級別,在同一事務後續的調用會使用舊的定義太,我不是100%肯定的默認級別會但是,這樣做)會阻止嘗試在更新時調用該函數的新事務,並在更換後執行新函數。

據我所知,Postgres的應該執行在一個事務中的所有替換功能(這樣的表被鎖定,所以當它被更新,那麼下一個交易鎖定將使用新的功能不是觸發器被修改舊的。對不對?

最好的我知道,當它的更新相關的觸發功能不鎖定表。

請藉此與一粒鹽,但:上面的兩個陳述相當於我直觀地體驗到的ct mvcc要做的,而不是知道Postgres的源代碼這個領域。 (一些核心貢獻者定期來到SO,並可能最終以更加精確的答案響起。)

請注意,這是比較直接的測試,也就是說:打開兩個psql會話,打開兩個事務,然後看看發生了什麼......