【數據庫】經過觸發器實現審計日誌記錄-應用篇

PostgreSQL觸發器,日誌審計小神器

 

最近遇到的項目問題,審計日誌記錄不夠詳細,好比某用戶編輯了某臺設備,只記錄了用戶操做的設備名、操做時間、登陸用戶和登陸IP,至於設備其餘屬性編輯前和編輯後的信息就沒有更詳細的對比了,審計粒度不夠細,顯然是不能讓客戶滿意的,秉承客戶滿意優先原則,只好技術加持一波了。web

 

實際客戶想要記錄的更多,涉及的業務屬性比較廣,返本溯源,咱們決定在數據庫層面解決,以期能最少的改動業務代碼。sql

利用PostgreSql觸發器在源表數據發生變化的時候準備一張對應表進行備份記錄,把變化數據就像提交svn同樣插入到歷史表中,如圖數據庫

 

 

解決方案有了,但其實還存在一個問題觸發器只在數據庫內部運行,如何記錄是當前是哪一個登陸用戶對數據源進行的變動仍是個問題,通過一位大佬的指導,能夠利用PostgreSql的會話變量解決,簡單的測試代碼以下框架

 

 

 

 

打印結果svn

 

 

 

這樣就能夠利用數據庫會話變量的特性,在每一次的數據庫變動前,先將全局操做pid關聯到用戶uid爲一張表,而變動的時候,將將全局操做pid插入到歷史數據表中,這樣經過惟一的全局操做pid就能夠關聯查詢出是哪一個用戶的操做了。函數

因而解決方案圖變爲post

 

 

 

開心的代碼實現測試

 

建立審計主表ui

 

 

 

 

 

建立審計歷史表spa

 

 

 

 

 

 

建立用戶id和操做id關聯表

 

 

 

 

在用戶進行數據操做變動的postgresql鏈接時,咱們都先將數據庫全局變量插入到operation_log表中,將當前登陸的用戶id與此次變動操做綁定在一塊兒,這個能夠封裝在web框架層實現。

 

 

建立觸發器

 

觸發器函數定義了觸發器被觸發後執行的操做,下面列一下觸發器函數中可使用的變量,例子中的 OLD,就表示觸發操做的舊數據行,詳細以下:

NEW:INSERTUPDATE 操做觸發的行級觸發器中存儲的新的數據行,

OLD:INSERTUPDATE 操做觸發的行級觸發器中存儲的的數據行,

TG_OP:表明當前觸發器監聽到的操做類型,數據類型爲 text,內容爲 INSERTUPDATEDELETETRUNCATE

 

 

 

 

小結

本文只是大概如何利用PostgreSql觸發器對用戶行爲進行詳細日誌審計,旨在提供一個觸發器記錄數據源變動和web框架結合的思路,但願對你有所幫助,若是你有更好的解決方案能夠留言告訴我哦

 

PS:若是文章對你有價值,歡迎點個推薦。

相關文章
相關標籤/搜索