a
의 행이 삽입, 업데이트 또는 삭제 될 때마다 b
에 해당 행을 삽입, 업데이트 또는 삭제하는 테이블이 a
이고 3 개의 트리거가 있습니다. 3 개의 트리거 모두 동일한 트리거 기능 p
을 사용합니다.PostgreSQL 트리거 함수에 대한 if 문을 조인
CREATE OR REPLACE FUNCTION p()
RETURNS TRIGGER
AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
-- INSERT INTO b ...
RETURN NEW;
ELSIF (TG_OP = 'UPDATE') THEN
-- UPDATE b ...
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
-- DELETE FROM b ...
RETURN NEW;
ELSE
RETURN NULL;
END IF;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER i AFTER INSERT ON a FOR EACH ROW EXECUTE PROCEDURE p();
CREATE TRIGGER u AFTER UPDATE ON a FOR EACH ROW EXECUTE PROCEDURE p();
CREATE TRIGGER d AFTER DELETE ON a FOR EACH ROW EXECUTE PROCEDURE p();
a
도있는 외부 키 a1
에 c
및 I는 그것이 IF
/ELSIF
분기도 c
의 열 c2
에 따라 입사하는 방식 p
을 변경하고자하는 (기본 키 c1
)와 : 조인 된 열이 변경된 경우 INSERT
및 UPDATE
가지를 입력하십시오. 동일하게 유지되면 UPDATE
분기를 입력하십시오. 이 같은 효과에 뭔가 : oldC
및 newC
가 발생할 것
IF (TG_OP = 'INSERT') OR ((TG_OP = 'UPDATE') AND (oldC.c2 <> newC.c2)) THEN
-- ...
ELSIF (TG_OP = 'UPDATE') OR (oldC.c2 = newC.c2) THEN
-- ...
ELSIF (TG_OP = 'DELETE') OR ((TG_OP = 'UPDATE') AND (oldC.c2 <> newC.c2)) THEN
-- ...
ELSE
-- ...
END IF;
다음과 유사한 조인 (약와 구문.) : 그래서
SELECT oldC.* FROM a, c AS oldC WHERE OLD.a1 = c.c1;
SELECT newC.* FROM a, c AS newC WHERE NEW.a1 = c.c1;
효과에 필요한 것을 두 개의 외부 조인 IF
문을 사용하면 oldC
및 newC
(또는 이와 유사한 내용)을 참조 할 수 있습니다. 이게 가능하며 p
의 변경된 버전은 (올바른 PostgreSQL 구문으로) 어떻게 표시됩니까?
하나는 올바른 "(내가 처음 해석을 지원하기 위해 c''에/사람 같아 트리거를 배치해야한다고 가정하는 것입니다 c2에 따라 c2 열에 따라 달라집니다 : 조인 된 열이 변경된 경우 ")? – Drux
@Drux : 예,'c.c2'의 변경을 감시하려면'c'에 트리거가 필요합니다. 너무 많은 트리거가있는 무한 루프를 만들지 않도록 조심하십시오. 때로는 데이터 수정 CTE를 사용하는 조합 된 쿼리가 좋은 대안입니다. [예제.] (http://stackoverflow.com/questions/20561254/insert-data-in-3-tables-at-a-time-using-postgres/20561627#20561627) –