我在postgresql數據庫表上創建了更新前和更新後的觸發器。PostgreSQL觸發器和臨時表
需要保留歷史記錄並同時爲所述數據創建新記錄。舊記錄將被標記爲已歸檔。
我打算使用臨時表來跟蹤NEW值並重置NEW值,以便將其標記爲已存檔。
在我更新後的觸發器中,我會從臨時表中讀取數據,並創建一個全新的活動記錄。
我的問題是在更新觸發器之前更新觸發器不可見時創建的臨時表。此外,我甚至不能傳遞任何參數(類型記錄)到更新後觸發器,因爲它是不允許的。
我已經在Oracle數據庫中使用全局臨時表實現了預期的結果,但在PostgreSQL中遇到困難。
這裏是之前更新觸發功能的示例代碼:
CREATE OR REPLACE FUNCTION trigger_fct_trig_trk_beforeupdate()
RETURNS trigger AS
$BODY$
DECLARE
some variable declarations;
BEGIN
Drop table IF EXISTS track_tmp_test;
CREATE TEMPORARY TABLE track_tmp_test(
...
);
Insert into track_tmp_test (........)
values(NEW., NEW..., NEW.., NEW...);
NEW... := OLD...;
NEW... := OLD.... ;
NEW... := OLD...;
Mark the NEW.status : = 'archived';
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER trig_trk_test_beforeupdate
BEFORE UPDATE ON test
FOR EACH ROW EXECUTE PROCEDURE trigger_fct_trig_trk_beforeupdate() ;
現在的後UPDATE觸發器功能:
CREATE OR REPLACE FUNCTION trigger_fct_trg_trk_afterupdate()
RETURNS trigger AS
$BODY$
DECLARE
some variables;
-- insert into original table the data from temporary that was inserted in before update trigger
INSERT into TEST (....)
select ....
from track_tmp_test ;
-- delete data from temporary table after insert
delete from track_tmp_test ;
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
有沒有一種方式,更新觸發後可以訪問創建臨時表在更新觸發器功能之前?
我不能擁有一個永久的表值,因爲許多用戶更新表中的數據可觸發觸發器。
從來沒有這樣做過,但是來自文檔「臨時表在會話結束時或在當前事務結束時自動刪除」。這可能會給你一個提示,爲什麼你不能在另一個事務中訪問表。 – DrColossos 2014-08-28 07:39:51
您的'AFTER'觸發器丟失。請將其添加到問題中。我將假設一種完全不同的方法,但我需要這些信息。並請澄清:您是否想要將* new *行或* old *行復制到* same *表或另一個*表(具有相同的結構)?你是否想將* new *行標記爲「已存檔」?這很奇怪,但這就是你的評論所說的。 – 2014-08-28 17:13:55
另外,請提供您的Postgres版本(as * always *)。 – 2014-08-28 17:32:10