2016-09-19 5 views
1

필드의 하나 이상이 변경된 경우 UPDATE가 발생한 후 테이블의 변경 내용을 추적하고 해당하는 기록 테이블에 저장하려고합니다. 열 중 하나가 변경된 경우 PostgreSQL 트리거

I가 다음과 같은 테이블 :

tbl_employees

CREATE TABLE tbl_employees (
    id serial NOT NULL, 
    first_name character varying NOT NULL, 
    last_name character varying NOT NULL 
) 

tbl_employees_history

CREATE TABLE tbl_employees (
    id serial NOT NULL, 
    employee_id NOT NULL, 
    first_name character varying NOT NULL, 
    last_name character varying NOT NULL, 
    changed_on timestamp NOT NULL 
) 

기능

CREATE OR REPLACE FUNCTION log_employee_changes() RETURNS trigger as 
$BODY$ 
BEGIN 
    IF (NEW.last_name <> OLD.last_name) or (NEW.first_name <> OLD.first_name) THEN 
    INSERT INTO tbl_employee_history(employee_id,last_name, first_name,changed_on) 
    VALUES(OLD.id,OLD.last_name, OLD.first_name,now()); 
    END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

트리거

CREATE TRIGGER add_log 
BEFORE UPDATE ON tbl_employees 
FOR EACH ROW 
EXECUTE PROCEDURE log_employee_changes(); 

지금까지 너무 좋아,이 일을 바로 사용할 수 있습니다. 하지만 난 테이블을 가지고 15 열을 말할 수 있는지 궁금하네요, 그리고 하나의 열이 변경되면 역사 기록을 저장하고 싶습니다. 모든 필드에 대해 IF 문을 반복해서 반복해야합니까? 아니면 모든 열을 확인하기위한 트릭이 있습니까? 그렇게하면 트리거 기능을 변경하는 것을 잊지 않고 테이블에 열을 추가 할 수 있습니다. 이 같은

뭔가 :

CREATE OR REPLACE FUNCTION log_employee_changes() RETURNS trigger as 
$BODY$ 
BEGIN 
    IF ?????there is one change on whatever column????? THEN 
    INSERT INTO tbl_employee_history(employee_id,last_name, first_name,changed_on) 
    VALUES(OLD.id,OLD.last_name, OLD.first_name,now()); 
    END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

답변

1

당신은 비교할 수 있습니다 전체 기록 :

나는 희망
if new <> old then ... 
+0

우 좋은 데요, 'didn를 그게 가능하다는 걸 알아! 감사합니다 – koala

1

, 당신을 위해 도움이 될 것입니다 :

CREATE OR REPLACE FUNCTION log_employee_changes() RETURNS trigger as 
$BODY$ 
BEGIN 
    IF OLD!=NEW THEN 
    INSERT INTO tbl_employee_history(employee_id,last_name, first_name,changed_on) 
    VALUES(OLD.id,OLD.last_name, OLD.first_name,now()); 
    END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 
+0

나는 그것을 또한 시도하고 또한 일한다! 그러나 <> 또는! = 사이에 어떤 차이가 있습니까? – koala

+1

! =은 <>의 별칭입니다. –

관련 문제