더 복잡한 예가 있습니다.SRC/TEST/Regress/Regress.Cand inContrib/SPI.
트리거 사용의 매우 간단한 예는 다음과 같습니다. 기능 trigf 트리거 된 관계 ttest의 튜플 수를보고합니다. 쿼리가 null을 x에 삽입하려고 시도하면 작업을 건너 뜁니다. (즉, 그것은 널 제약이 아닌 역할을하지만 거래).
#include "executor/spi.h"/ * 이것은 spi */로 작업하는 데 필요한 것입니다. #include "명령/trigger.h"/ * - " - 트리거 */ 외부 Datum trigf (pg_function_args); pg_function_info_v1 (trigf); 자료 trigf (pg_function_args) triggerData *trigdata = (triggerData *) fcinfo- 컨텍스트; tupledesc tupdesc; heppuple rettuple; char *언제; bool checknull = false; bool isnull; int ret, i; / * trigdata가 내가 기대하는 것을 가리키고 있는지 확인하십시오 */ if (! calling_as_trigger (fcinfo)) elog (오류, "Trigf : 트리거 관리자에 의해 발사되지 않음"); / * 유령으로 돌아갈 튜플 */ if (trigger_fired_by_update (trigdata- tg_event)) rettuple = trigdata- tg_newtuple; 또 다른 rettuple = trigdata- tg_trigtuple; /* 널 확인? */ if (! trigger_fired_by_delete (trigdata- tg_event) && trigger_fired_before (trigdata- tg_event))) Checknull = true; if (trigger_fired_before (trigdata- tg_event)) 언제 = "전"; 또 다른 언제 = "후"; tupdesc = trigdata- tg_relation- rd_att; / * SPI 관리자에게 연결 */ if ((ret = spi_connect ()) <0) elog (통지, "trigf (fired %s) : spi_connect가 반환 된 %d", 언제, ret); / * 관련 튜플 수를 얻으십시오 */ ret = spi_exec ( "사설 토토 사이트에서 count (*) 선택", 0); if (ret <0) elog (통지, "trigf (fired %s) : spi_exec이 %d를 반환 할 때, ret); i = spi_getBinval (spi_tuptable- vals [0], spi_tuptable- tupdesc, 1, & isnull); elog (통지, "trigf (발사 %s) : 사설 토토 사이트에는 %d 튜플이 있습니다", 언제, i); spi_finish (); if (checknull) i = spi_getbinval (rettuple, tupdesc, 1, & isnull); if (isnull) rettuple = null; 반환 pointergetDatum (rettuple);
이제 트리거 함수를 컴파일하고 만듭니다.
함수 만들기 trigf ()는 불투명하게 반환합니다 '... path_to_so'언어 'c'; 테스트 생성 (x int4);
vac = ttest에서 삽입 또는 업데이트 또는 삭제하기 전에 트리거 생성 각 행에 대해 절차를 실행합니다. Trigf (); 만들다 vac = ttest에서 삽입 또는 업데이트 또는 삭제 후 Trigger Tafter 작성 각 행에 대해 절차를 실행합니다. Trigf (); 만들다 Vac = ttest 값 (null)에 삽입; 통지 : trigf (이전에 발사) : ttest에는 0 개의 튜플이 있습니다 0 0을 삽입하십시오 - 삽입을 건너 뛰고 트리거가 발사되지 않았습니다 vac = ttest에서 선택 *; 엑스 - (0 줄) Vac = ttest 값에 삽입 (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 set x = null 여기서 x = 2; 통지 : trigf (이전에 발사) : ttest에는 2 개의 튜플이 있습니다 업데이트 0 Vac = 업데이트 ttest set 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 줄)
이전 | 홈 | PostgreSQL : 문서 : 7.1 : 서버 프로그래밍 스포츠 토토 결과 |
데이터 가시성 변화 | up | 서버 프로그래밍 인터페이스 |