2010年5月12日 星期三

Postgresql Trigger -- (II) 待完

做個Trigger的範例。歷程功能。

相信大家都曾經碰過這樣的狀況,  有一些非常非常重要的資料表,像是金錢往來的會計資料,記錄進出貨的庫存資料,我們希望對它做的所有操作,都能留下記錄,以便萬一出事的時候,可以查到倒底是誰動過資料。

要達到這樣的效果,有兩種做法,一種是在應用程式裡面做,一開始的時候,就開兩張資料表,一張主資料表,一張歷程資料表,主資料表中記下誰,在什麼時候動過資料,歷程資料表中則多一個欄位,記錄是做了什麼動作(新增、修改、刪除)

可是世界往往不像我們想像的那麼美好,有誰會知道,有一天某張資料表會變得那麼重要,重要到要幫它做歷程呢?

因此,大部份狀況,我們都是臨時決定,或被通知,要幫某資料表做歷程。在這種狀況下,往往系統都已經上線使用,要請廠商修改,都要花一筆錢。這種狀況下,PostgreSQL的Trigger就幫上忙了。

第二種作法就是,你可以臨時加開一張歷程表,利用Trigger,設定主資料表有任何動作時(新增、修改、刪除),都要到歷程表中寫入歷程資料。但是,要特別提出來的,主資料表中,一定要記下誰,在什麼時候動過資料,這種做法才能夠適用,因此,記得,在採購任何系統時,一定要記得提出,每張資料表中,必需有operateBy (最後資料操作者),這個欄位,以免碰上要加歷程功能時,廠商還要修改加錢。

如果你忘記了,那Trigger只能幫我們留下,主資料表在什麼時候 operateAt,被做了什麼操作operate。至於是誰,你可能要到系統的登入記錄去找找,那個時間,有那一個有權限的人登入了系統。至於是不是他做的,那就還有得爭了。

-- Drop Table exgRateLog;
-- Drop Table exgRate;


Create Table exgRate (
   exgRateId serial primary key, -- 主鍵
   factTime timestamp,            -- 匯入時間
   currency char(3),               -- 貨幣別
   purpose varchar(2),            -- 匯率種類
   currType varchar(10),          -- 貨幣種類
   rate numeric(18,6),             -- 匯率

   operateAt timestamp,
   operateBy varchar(15)
);







Create Table exgRateLog (
   exgRateId serial primary key, -- 主鍵
   factTime timestamp,            -- 匯入時間
   currency char(3),               -- 貨幣別
   purpose varchar(2),            -- 匯率種類
   currType varchar(10),          -- 貨幣種類
   rate numeric(18,6),             -- 匯率
   operateAt timestamp,
   operateBy varchar(15),
   operate char(1)
);

1 則留言:

  1. 小弟很佩服大大這樣肯花時間在Postgresql。
    請問這位大大,postgresql 如何支援partition下的資料備份方式? 我可以只備份partition嗎?

    回覆刪除