2013-03-12 130 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