2017-01-09 1 views
0

다음은 예제 테이블입니다.PostgreSQL에서 단일 속성을 업데이트하기 위해 트리거를 수정하는 방법

CREATE TABLE employee_test(
idTst SERIAL PRIMARY KEY, 
monthDownload VARCHAR(6), 
changeDate DATE); 

monthDownload 특성이 업데이트 될 때 현재 날짜로 changeDate 특성을 업데이트하는 함수 및 트리거를 만들려고합니다. 내가 가지고있는 기능은 하나의 문제와 함께 작동합니다. 업데이트 된 레코드 대신 모든 레코드를 업데이트합니다.

CREATE OR REPLACE FUNCTION downloadMonthChange() 
RETURNS TRIGGER AS 
$$ 
BEGIN 
IF NEW.monthDownload <> OLD.monthDownload THEN 
UPDATE employee_test 
SET changeDate = current_date 
where OLD.idTst = NEW.idTst; 
END IF; 
RETURN NEW; 
END; 
$$ 
Language plpgsql; 

는 트리거

Create TRIGGER dataTest 
AFTER UPDATE 
ON employee_test 
FOR EACH ROW 
EXECUTE PROCEDURE downloadMonthChange(); 

나는 다음 업데이트 문을 실행

:

UPDATE employee_test SET monthDownload = 'oct12' 
WHERE idTst = 1; 

모든 CHANGEDATE 행은 현재 날짜와 업데이 트를 얻을. 변경된 레코드가있는 행만 사용하여 현재 날짜를 업데이트하는 방법이 있습니까? 당신이 before 트리거를 사용하는 경우가 after 트리거를 사용해야하는 경우

enter image description here

답변

2

당신은 where 절에 기본 키를 포함하는 NEW

CREATE OR REPLACE FUNCTION downloadMonthChange() 
RETURNS TRIGGER AS 
$$ 
BEGIN 
IF NEW.monthDownload <> OLD.monthDownload THEN 
    NEW.changeDate = current_date; 
END IF; 
RETURN NEW; 
END; 
$$ 
Language plpgsql; 

다른 옵션에 바로 쓸 수 있습니다 . 이 작업을 수행하려했으나 쿼리에 OLD이 표시되었습니다. where 절은 방아쇠 호출에 책임이있는 레코드를보고 있었으며 업데이트 할 레코드를 제한하지 않았습니다.

IF NEW.monthDownload <> OLD.monthDownload THEN 
UPDATE employee_test 
SET changeDate = current_date 
where idTst = NEW.idTst; 
관련 문제