2013-08-03 31 views
1

我想使用觸發器實現審計日誌,觸發器會在創建,更改和刪除的數據上觸發以存儲一些值。這些觸發器應該能夠使用用戶ID進行更改並由Web應用程序管理。我對提供這些數據有一些想法,但我似乎並沒有完全理解觸發器的執行上下文是什麼。我讀過PostgreSQL文檔Overview of Trigger Behavior和其他人,但我的問題似乎沒有得到回答。PostgreSQL中數據庫觸發器的執行上下文

我想知道的是客戶端會話與一個正在運行的事務之間的交互以及觸發器執行和兩者的生命週期以及它們如何相互依賴。根據我的理解,觸發器在數據庫內獨立於創建導致觸發器執行的事件的客戶端會話執行。那是對的嗎?這意味着觸發器及其處理不會影響客戶端請求的性能,客戶端可以隨時關閉會話。如果兩者都是獨立的,那麼觸發器如何得到關於客戶回滾事務的通知,這在邏輯上意味着根本沒有數據被改變?或者觸發器onyl在提交事務後執行,因爲它們獨立運行?

或者觸發器是否在客戶端會話中執行異步,從而創建導致觸發器執行的事件?這意味着如果客戶因任何原因關閉了會話,觸發器也會中止。它們的更改直接綁定到客戶端交易,並且可以回滾。

我需要了解行爲以瞭解我想要在another question中做什麼。

感謝您的輸入!

+1

你看過現有的審計觸發器實現嗎? https://wiki.postgresql.org/wiki/Audit_trigger_91plus和 https://github.com/2ndQuadrant/audit-trigger – bma

+1

不,觸發器不是獨立的和異步的,觸發器是事務的固有部分,它在用戶會話中執行。如果在操作結束後(但在提交之前)發出回滾,則事務和trigerr所做的所有更改都將回滾。 – krokodilko

+0

@bma:不,我沒有,謝謝你的鏈接。我無法使用新版本,因爲我堅持8.4,但會看看舊的實現。 –

回答

1

從我的理解觸發器在數據庫 獨立於客戶端會話這創造 導致觸發執行該事件中執行。那是對的嗎?這將意味着觸發器 和他們的處理不會影響客戶端請求 的性能和客戶可以在任何時間

沒有他們完全依賴於客戶端會話,作爲交易的一部分關閉會話本身與會議掛鉤。 查看來自CREATE TRIGGER這個片段(9.1):

它們可以在使 觸發事件,或在含有事務結束的語句的末尾被解僱任;在 後一種情況下,他們被說成是推遲

從你other question看來你使用8.4,不具有延遲觸發,因此它更簡單。觸發器始終在語句結束時(觸發事件)運行,這意味着在服務器向客戶端發送確認執行之前。

緊接着的一個COMMIT將是一個新的指令,並且在觸發完成之前無法執行。

+0

謝謝,多數民衆贊成清楚和簡單。 :-)這意味着觸發器可以完全訪問我在事務中執行的所有事情,特別是創建臨時表,其中包含與引起觸發器執行的語句無關的數據,對嗎?我的意思是創建一個臨時表,插入一些數據,執行導致觸發執行的語句,觸發器可以訪問以前插入的數據。 –