src/test/regress/regress.c에 더 복잡한 예가 있습니다. 그리고 contrib/spi에 있습니다.
다음은 트리거 사용법의 매우 간단한 예입니다. 함수 삼각 트리거된 관계의 튜플 수를 보고합니다. 쿼리가 x에 NULL을 삽입하려고 시도하면 작업을 건너뜁니다. (즉, NOT NULL 제약 조건으로 작동하지만 중단하지는 않습니다. 거래).
#include "executor/spi.h" /* SPI로 작업하는 데 필요한 것입니다 */
#include "commands/trigger.h" /* -"- 및 트리거 */
HeapTuple trif(void);
힙튜플
삼각()
TupleDesc tupdesc;
HeapTuple retuple;
문자 *언제;
부울 체크널 = 거짓;
bool은 null입니다.
int ret, i;
if (!CurrentTriggerData)
elog(WARN, "trigf: 트리거가 초기화되지 않았습니다.");
/* Executor로 돌아갈 튜플 */
if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData-tg_event))
rettuple = CurrentTriggerData-tg_newtuple;
그렇지 않으면
rettuple = CurrentTriggerData-tg_trigtuple;
/* NULL을 확인합니까? */
if (!TRIGGER_FIRED_BY_DELETE(CurrentTriggerData-tg_event) &&
TRIGGER_FIRED_BEFORE(CurrentTriggerData-tg_event))
체크널 = 참;
if (TRIGGER_FIRED_BEFORE(CurrentTriggerData-tg_event))
when = "이전";
그렇지 않으면
언제 = "이후";
tupdesc = CurrentTriggerData-tg_relation-rd_att;
CurrentTriggerData = NULL;
/* SPI 관리자에 연결 */
if ((ret = SPI_connect()) < 0)
elog(WARN, "trigf(%s 실행): SPI_connect가 %d을(를) 반환했습니다.", when, ret);
/* 관계에 있는 튜플의 수를 구합니다 */
ret = SPI_exec("ttest에서 카운트(*) 선택", 0);
만약 (ret < 0)
elog(WARN, "trigf (%s 실행): SPI_exec가 %d을(를) 반환했습니다.", when, ret);
i = SPI_getbinval(SPI_tuptable-vals[0], SPI_tuptable-tupdesc, 1, &isnull);
elog(알림, "trigf(%s 실행됨): ttest에 %d개의 튜플이 있습니다.", when, i);
SPI_finish();
if(체크널)
i = SPI_getbinval(rettuple, tupdesc, 1, &isnull);
만약 (isnull)
리튜플 = NULL;
반환(retuple);
이제, 테이블 스포츠 토토 베트맨 (x int4)를 컴파일하고 생성하십시오; 함수 생성 trigf()는 '...path_to_so' 언어 'c'로 불투명을 반환합니다.
vac= ttest에서 삽입 또는 업데이트 또는 삭제 전에 트리거를 생성합니다.
각 행에 대해 trigb() 프로시저를 실행합니다.
만들기
vac= ttest에서 삽입, 업데이트 또는 삭제 후 트리거 생성
각 행에 대해 trigb() 프로시저를 실행합니다.
만들기
vac= ttest 값에 삽입(null);
주의 사항:trigf(이전에 실행됨): ttest에는 0개의 튜플이 있습니다.
삽입 0 0
-- 삽입을 건너뛰고 AFTER 트리거가 실행되지 않습니다.
vac= ttest에서 *를 선택합니다.
엑스
-
(0행)
vac= 테스트 값에 삽입 (1);
주의 사항:trigf(이전에 실행됨): ttest에는 0개의 튜플이 있습니다.
주의 사항:trigf( 이후에 실행됨): ttest에는 1개의 튜플이 있습니다.
^^^^^^^^
가시성에 관해 우리가 말한 것을 기억하십시오.
삽입 167793 1
vac= ttest에서 *를 선택합니다.
엑스
-
1
(1줄)
vac= ttest에 삽입하고 ttest에서 x * 2를 선택합니다.
주의 사항:trigf(이전에 실행됨): ttest에는 1개의 튜플이 있습니다.
주의 사항:trigf(다음에 실행됨): ttest에는 2개의 튜플이 있습니다.
^^^^^^^^
가시성에 관해 우리가 말한 것을 기억하십시오.
삽입 167794 1
vac= ttest에서 *를 선택합니다.
엑스
-
1
2
(2열)
vac= ttest 세트 업데이트 x = null 여기서 x = 2;
주의 사항:trigf(이전에 실행됨): ttest에는 2개의 튜플이 있습니다.
업데이트 0
vac= ttest 세트 x = 4 업데이트 여기서 x = 2;
주의 사항:trigf(이전에 실행됨): ttest에는 2개의 튜플이 있습니다.
주의 사항:trigf(다음에 실행됨): ttest에는 2개의 튜플이 있습니다.
업데이트 1
vac= ttest에서 *를 선택합니다.
엑스
-
1
4
(2열)
vac= ttest에서 삭제;
주의 사항:trigf(이전에 실행됨): ttest에는 2개의 튜플이 있습니다.
주의 사항:trigf( 이후에 실행됨): ttest에는 1개의 튜플이 있습니다.
주의 사항:trigf(이전에 실행됨): ttest에는 1개의 튜플이 있습니다.
주의사항:trigf(다음에 실행됨): ttest에 0개의 튜플이 있습니다.
^^^^^^^^
가시성에 관해 우리가 말한 것을 기억하십시오.
2 삭제
vac= ttest에서 *를 선택합니다.
엑스
-
(0행)