本節書摘來自華章計算機《postgresql伺服器程式設計》一書中的第1章,第1.5節,作者:(美)hannu krosing, jim mlodgenski, kirk roybal 著
,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
如果你需要知道誰對資料做了什麼操作、是在什麼時候進行的操作,一個簡單的方法就是用日志來記錄每個在重要的資料表上執行的動作。
這裡至少有兩種等效的方法可進行這種稽核:
使用稽核觸發器
僅允許通過函數的方式來通路表,并且僅在函數内完成稽核
接下來,我們将分别看一下每種方法的簡單示例。
首先,我們建立這些表:

在一般情況下,并不希望使用者可以更改稽核日志,是以你隻會把權限給到管理者,讓他們可以通路這些表。而如果你計劃讓使用者直接通路薪資表,為了達到稽核的目的,你應該在這個表上放置一個觸發器:
現在,讓我們測試一下一些薪資管理:
為了達到稽核的目的,每個更改都被儲存到薪資變更日志表:
另一方面,你可能并不希望每個人都有直接通路薪資表的權限,在這種情況下,你可以執行以下語句:
同時,你給使用者僅僅開放了兩個函數的通路權限:一個是為了讓任何使用者可以查詢薪資,另外一個是為了更改薪資,這個是隻有管理者才可以操作的。
這些函數本身都有所有基礎表的通路權限,因為它們被聲明為安全定義者(security definer),也就意味着它們執行的時候有建立者的權限。
薪資檢視函數如下所示:
請注意,這裡我們實作了一個“軟體安全”(soft security)的方法,即你可以檢視别人的薪資,但是你必須為這件事情負責,就是說,僅僅當你需要這樣做時才有必要進行這樣的操作,因為管理者将會知道你已經檢視過别人的薪資。
set_salary()函數抽象出一個需求——檢查使用者是否存在,如果使用者不存在,則建立使用者。如果将使用者的薪資設定為0,則會将使用者從薪資表中删除。是以這個接口是被徹底簡化的,這些函數的用戶端應用程式需要知道的和完成的則會更少:
現在删除audit觸發器(否則,更改會被日志記錄兩次),并測試新的功能: