다음에 더 복잡한 예가 있습니다.src/test/regress/regress.c그리고기여/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)을 컴파일하고 생성하십시오:
생성 함수 trif()는 다음과 같이 불투명을 반환합니다. '...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행)