2013-03-12 152 views
0

我想創建一個觸發器,以便每當我進行更改(更新或刪除)時,都應該將舊數據複製到新表(使用相同的模板)。postgresql-使用觸發器觸發

我試過這段代碼:

create table restrictions(ID int,name text); 

insert into restrictions values(122,'suresh'); 

select * from restrictions; 

create table restrictions_deleted(ID int,name text);// this is my duplicate table for keeping information of all updations. 

CREATE OR REPLACE FUNCTION moveDeleted() RETURNS trigger AS $$ 
    BEGIN 
     INSERT INTO restrictions_deleted VALUES(OLD.ID, OLD.name); 
     RETURN OLD; 
    END; 
$$ LANGUAGE plpgsql; 


CREATE OR REPLACE TRIGGER moveDeleted 
BEFORE DELETE ON restrictions 
FOR EACH ROW 
EXECUTE PROCEDURE moveDeleted(); 

delete from restrictions where ID=122; 
select * from restrictions_deleted; 

這個代碼能夠全部被刪除的數據記錄到重複表的。但是我也想爲更新做同樣的事情。

任何建議,任何想法?

+0

你肯定要_replicate上的更新操作的整體table_?您是否考慮過使用數據模型來記錄您需要知道的歷史信息? – 2013-03-12 09:35:07

+0

@ClassStacker當前的觸發器不會複製整個**表。它只會應付當前行。 – 2013-03-12 10:00:02

+0

@IgorRomanchenko絕對。我的錯。 – 2013-03-12 10:06:09

回答

0

首先 - 在觸發功能中,您需要RETURN NEW;而不是RETURN OLD;

第二 - 將觸發器更改爲BEFORE DELETE OR UPDATE

最後 - 最好有AFTER DELETE OR UPDATE作爲日誌記錄觸發器。這樣,當更改被回滾時,它不會做無用的工作。

BTW here是記錄/審計觸發器的一個很好的例子。

UPDATE:

的功能將類似於:

CREATE OR REPLACE FUNCTION moveDeleted() RETURNS trigger AS $$ 
    BEGIN 
    IF (TG_OP = 'UPDATE') THEN 
     INSERT INTO restrictions_deleted VALUES(OLD.ID, OLD.name); 
     RETURN NEW; 
    ELSIF (TG_OP = 'DELETE') THEN 
     INSERT INTO restrictions_deleted VALUES(OLD.ID, OLD.name); 
     RETURN OLD; 
    END IF; 
    END; 
$$ LANGUAGE plpgsql; 
+0

我與這個你告訴,但是我想同時使用同一個trigger.kindly提供一個建議 – Patrick 2013-03-12 11:28:34

+0

@ user2160090'後刪除或更新'將'UPDATE'和'DELETE'一起工作。閱讀手冊['here'](http://www.postgresql.org/docs/current/static/sql-createtrigger.html)以獲取更多信息。 – 2013-03-12 11:31:35

+0

但是我嘗試過,但不是爲兩者工作,如果使用代碼更新意味着我們必須給予新的,刪除,我們必須給老,如何給這兩個使用觸發器。請參考上面給出的代碼功能。 – Patrick 2013-03-12 11:45:49