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

그리고 당신은 당신이 업데이트 작업에 전체 table_을 _replicate 하시겠습니까있어? 당신이 알아야 할 역사적인 정보를 기록한 데이터 모델을 사용 해본 적이 있습니까? –

+0

@ClassStacker 현재 트리거는 ** 전체 ** 테이블을 복제하지 않습니다. 현재 행을 처리 할 것입니다. –

+0

@IgorRomanchenko 물론입니다. 내 잘못. –

답변

0

처음에는 트리거 기능에서 RETURN OLD; 대신 RETURN NEW;이 필요합니다.

두 번째 - 트리거를 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

나는 당신이 말한 것과 같이 일했지만 동일한 트리거로 업데이트와 삭제를 모두 원합니다. 친절하게 제안합니다 – Patrick

+0

@ user2160090'AFTER DELETE OR UPDATE'는'UPDATE'와'DELETE' 둘 다 작동합니다. 더 자세한 정보는 매뉴얼 ['here'] (http://www.postgresql.org/docs/current/static/sql-createtrigger.html)을 참조하십시오. –

+0

그러나 나는 시도했지만 둘 다 작동하지 않습니다. 업데이트를위한 코드를 사용한다면 우리는 NEW를 주어야합니다. 삭제를 위해서는 OLD로 두 가지를 모두 사용하는 방법을 제공해야합니다. 위에서 주어진 코드를 참조하십시오. – Patrick

관련 문제