2012-10-10 7 views
1

나는 여러 개의 테이블을 가지고 있으며 변경 사항, 변경 내용 및 변경 사항을 기록하려고합니다. PostgreSQL 9.2PostgreSQL 9.2 트리거가 다른 테이블에있는 데이터의 변경 사항을 기록합니다.

CREATE TABLE unitsref (
unitsrefid serial primary key, 
units varchar, 
unitname varchar, 
inuse boolean, 
systemuse varchar, 
keynotes integer, 
linkid integer 
); 

OLD를 사용하는 것이 가장 좋습니다. * IS DISTINCT FROM NEW. *?

CREATE TRIGGER log_unitsref 
    AFTER UPDATE ON unitsref 
    FOR EACH ROW 
    WHEN (OLD.* IS DISTINCT FROM NEW.*) 
EXECUTE PROCEDURE log_unitsref(); 

나는 세 개의 필드 만 정말 관심이 :

recordtype varchar, 
recordkey varchar, 
changetype varchar, 
personid integer, 
changedate date, 
changetime time, 
changefrom varchar, 
changeto varchar, 

최선의 구문은 무엇입니까 :

units varchar, 
unitname varchar, 
inuse boolean, 

내가 필드 테이블 이벤트 로그에서 이러한 변경 사항을 기록 할 이 작업을 수행하는 함수를 작성 하시겠습니까? 진행 Openedge에서 내가

create EventLog. 
assign EventLog.PersonId = glb-Personid 
     EventLog.RecordType = "UnitsRef" 
     EventLog.RecordKey = UnitsRef.Units 
     EventLog.ChangeType = "Create" 
     EventLog.changeFrom = "" 
     EventLog.changeTo = "" 
     EventLog.changeDate = today 
     EventLog.changeTime = time 

를 작성합니다하지만 난 세 개의 필드 만 정말 관심이 PostgreSQL을

답변

4

에서 최선의 방법을 모르겠어요

그럼해야 다음 입력란을 변경 한 후에 만 ​​트리거를 호출하는 것이 더 효율적입니다.


CREATE TRIGGER log_unitsref 
AFTER UPDATE OF units, unitname, inuse 
ON unitsref 
FOR EACH ROW 
WHEN (OLD.units, OLD.unitname, OLD.inuse) IS DISTINCT FROM (NEW.units, NEW.unitname, NEW.inuse) 
EXECUTE PROCEDURE log_unitsref();

나는 the manual on CREATE TRIGGER을 인용 :

UPDATE OF ...

트리거만이 화재 나열된 열 중 적어도 하나는 UPDATE 명령의 대상으로 언급 경우.

WHEN ...

트리거 기능 실제로 실행할지 여부를 결정하는 부울 표현.

이 두 요소는 서로 밀접하게 관련되어 있지만 상호 배타적이거나 중복되지 않습니다.

  • 관심 대상 열이 관련되어 있지 않으면 트리거를 전혀 시작하지 않는 것이 훨씬 저렴합니다.

  • 관심있는 열이 실제로 변경되지 않은 경우 트리거 기능을 실행하지 않는 것이 훨씬 저렴합니다.

    관련이 here 또는 here 응답

...

+0

뛰어난 표현이 매우 유용 할 때 - 내가 그 인식하지 않았다. 나는 변경 사항을 기록 할 필요가있는 약 20 개의 테이블을 가지고 있으므로 일반 솔루션을 찾았습니다. 이 링크를 사용하여 링크 당 TABLE audit.logged_actions를 사용하기 위해 테이블 ​​이벤트 로그를 변경할 것입니다.나는 또한 감사/이벤트 로그를 별도의 스키마에 저장하는 것에 대해 궁금해했다. 감사합니다 https://github.com/ringerc/scrapcode/blob/master/postgresql/audit.sql – user1044111

관련 문제