포스트그레다양한 클라이언트가 있습니다 Perl, Tcl, Python 및 C와 같은 인터페이스와 두 가지절차적 언어(PL). 그것은 또한 C 함수를 트리거 작업으로 호출할 수 있습니다. 참고하세요 STATEMENT 수준 트리거 이벤트는 현재 지원되지 않습니다. 버전. 현재 INSERT에 BEFORE 또는 AFTER를 지정할 수 있습니다. 트리거 이벤트로 튜플을 삭제하거나 업데이트합니다.
토토 결과 이벤트가 발생하면 토토 결과 관리자(에 의해 호출됨) 실행자) 전역 구조 TriggerData를 초기화합니다. *CurrentTriggerData(아래 설명) 및 토토 결과 호출 이벤트를 처리하는 함수입니다.
토토 결과 기능은 토토 결과가 실행되기 전에 생성되어야 합니다. 인수를 사용하지 않고 불투명하게 반환하는 함수로 생성되었습니다.
트리거를 생성하는 구문은 다음과 같습니다:
CREATE TRIGGER <토토 결과 이름 <BEFORE|AFTER <INSERT|DELETE|UPDATE
ON <관계 이름 FOR EACH <ROW|STATEMENT
EXECUTE PROCEDURE <프로시저 이름 (<함수 인수);
토토 결과의 이름은 당신이 삭제해야 할 경우에 사용됩니다 방아쇠. DROP TRIGGER 명령의 인수로 사용됩니다.
다음 단어는 함수가 이전에 호출되는지 여부를 결정합니다. 또는 이벤트가 끝난 후.
명령의 다음 요소는 어떤 이벤트가 일어날 것인지를 결정합니다. 기능을 트리거합니다. 여러 이벤트를 구분하여 지정할 수 있습니다. 또는.
관계 이름은 이벤트가 적용되는 테이블을 결정합니다 에.
FOR EACH 문은 트리거 실행 여부를 결정합니다. 영향을 받은 각 행에 대해 또는 전체 명령문 이전(또는 이후)에 대해 완료되었습니다.
프로시저 이름은 호출된 C 함수입니다.
인수는 CurrentTriggerData의 함수에 전달됩니다. 구조. 함수에 인수를 전달하는 목적은 다음과 같습니다. 비슷한 요구 사항을 가진 서로 다른 트리거가 동일한 호출을 허용하도록 허용 기능.
또한 함수는 다른 관계를 토토 결과하는 데 사용될 수 있습니다 (이러한 기능은 "일반 토토 결과 기능"으로 명명됩니다.)
위의 두 기능을 모두 사용하는 예로서 다음이 있을 수 있습니다. 두 개의 필드 이름과 현재 사용자를 하나에 넣고 현재 타임스탬프를 기타. 이를 통해 INSERT 이벤트에 트리거를 기록할 수 있습니다. 거래 테이블의 레코드 생성을 자동으로 추적합니다. 예. 사용되는 경우 "마지막 업데이트" 기능으로 사용할 수도 있습니다. 업데이트 이벤트에서.
트리거 함수는 호출 실행자에게 HeapTuple을 반환합니다. 이 INSERT, DELETE 또는 UPDATE 이후에 실행되는 트리거에 대해서는 무시됩니다. 작업을 수행하지만 BEFORE 트리거는 다음을 수행할 수 있습니다. - 건너뛰려면 NULL을 반환합니다. 현재 튜플에 대한 작업(따라서 튜플은 삽입/업데이트/삭제); - 다른 튜플에 대한 포인터를 반환합니다. (INSERT 및 UPDATE만 해당) 새 버전으로 삽입됩니다. 업데이트된 경우 원본 튜플 대신 업데이트된 튜플입니다.
CREATE에 의해 초기화가 수행되지 않는다는 점에 유의하세요. TRIGGER 핸들러. 이는 향후 변경될 예정입니다. 또한, 그 이상이라면 동일한 이벤트에 대해 둘 이상의 트리거가 정의되어 있습니다. 관계상, 방아쇠 발사 순서는 예측할 수 없습니다. 이는 다음과 같습니다. 앞으로는 바뀔 것입니다.
토토 결과 기능이 SQL 쿼리를 실행하는 경우(SPI 사용) 이러한 쿼리는 토토 결과를 다시 실행할 수 있습니다. 이것을 캐스케이딩이라고 합니다. 토토 결과. 캐스케이드 수에는 명시적인 제한이 없습니다. 수준.
INSERT에 의해 트리거가 실행되고 새 튜플을 동일한 관계이면 이 트리거가 다시 실행됩니다. 현재, 이러한 경우의 동기화 등을 위해 제공된 것이 없습니다. 하지만 이는 바뀔 수도 있습니다. 현재 funny_dup17() 함수가 있습니다. 재귀를 중지하기 위해 몇 가지 기술을 사용하는 회귀 테스트에서 (계단식) 자체적으로...