Postgresql 9.2.24 문서 | ||||
---|---|---|---|---|
이전 | up | 제 36 장. 토토 커뮤니티 | PostgreSQL : 문서 : 9.2 : 사설 토토 시스템 |
여기에 작성된 트리거 함수의 매우 간단한 예입니다. C. (절차 언어로 작성된 트리거의 예는 절차 언어의 문서에서 찾을 수 있습니다.)
함수trigf
보고서
테이블의 행 수ttest및
명령이 삽입하려고 시도하면 실제 작업을 건너 뜁니다.
열에 null 값x. (그래서
토토 커뮤니티는 널없는 구속 조건으로 작용하지만
거래.)
먼저 테이블 정의 :
테이블 생성 ttest ( x 정수 );
이것은 트리거 함수의 소스 코드입니다 :
#include "postgres.h" #include "executor/spi.h"/ * 이것은 SPI와 함께 작업하는 데 필요한 것입니다 */ #include "명령/trigger.h"/ * ... 트리거 ... */ #include "utils/rel.h"/ * ... 그리고 관계 */ #ifdef pg_module_magic PG_MODULE_MAGIC; #endif 외부 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; / * 전혀 방아쇠로 불리는지 확인 */ if (! calling_as_trigger (fcinfo)) elog (Error, "Trigf : Trigger Manager가 호출하지 않음"); / * 유령으로 돌아갈 튜플 */ 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 (Error, "trigf (fired %s) : spi_connect가 반환 된 %d", 언제, ret); / * 테이블에 행을 얻습니다 */ ret = spi_exec ( "ttest에서 count (*) 선택", 0); if (ret <0) elog (Error, "trigf (fired %s) : spi_exec이 %d를 반환 할 때, ret); /*count (*) int8을 반환하므로 변환에주의하십시오*/ i = datumgetint64 (spi_getbinval (spi_tuptable- vals [0], spi_tuptable- tupdesc, 1, & isnull); elog (info, "trigf (fired %s) : ttest에는 %d 행이 있습니다", 언제, i); spi_finish (); if (checknull) spi_getbinval (rettuple, tupdesc, 1, & isnull); if (isnull) rettuple = null; 반환 pointergetDatum (rettuple);
소스 코드를 컴파일 한 후 (참조섹션 35.9.6), 함수를 선언하십시오 그리고 트리거 :
함수 만들기 trigf () 트리거를 반환합니다 처럼 'filename' 언어 C; ttest에서 삽입하거나 업데이트하거나 삭제하기 전에 Trigger 작성 각 행에 대해 절차를 실행합니다. Trigf (); ttest에서 삽입 또는 업데이트 또는 삭제 후 트리거 테이퍼를 만듭니다. 각 행에 대해 절차를 실행합니다. Trigf ();
이제 토토 커뮤니티 작업을 테스트 할 수 있습니다 :
= ttest 값 (null)에 삽입; 정보 : trigf (이전 해고) : ttest에는 0 행이 있습니다. 0 0을 삽입하십시오 - 삽입을 건너 뛰고 트리거가 발사되지 않았습니다 = ttest에서 * 선택 *; 엑스 --- (0 줄) = ttest 값 (1)에 삽입; 정보 : trigf (이전 해고) : ttest에는 0 행이 있습니다. 정보 : trigf (이후 발사) : ttest에는 1 개의 행이 있습니다. ^^^^^^^^ 가시성에 대해 우리가 말한 것을 기억하십시오. 삽입 167793 1 vac = ttest에서 선택 *; 엑스 --- 1 (1 줄) = ttest에 삽입하여 ttest에서 x * 2를 선택하십시오. 정보 : trigf (이전 해고) : ttest에는 1 개의 행이 있습니다. 정보 : trigf (후 발사) : ttest에는 2 개의 행이 있습니다. ^^^^^^ 가시성에 대해 우리가 말한 것을 기억하십시오. 삽입 167794 1 = ttest에서 * 선택 *; 엑스 --- 1 2 (2 줄) = 업데이트 ttest set x = null 여기서 x = 2; 정보 : trigf (이전 해고) : ttest에는 2 개의 행이 있습니다. 업데이트 0 = 업데이트 ttest set x = 4 여기서 x = 2; 정보 : trigf (이전 해고) : ttest에는 2 개의 행이 있습니다. 정보 : trigf (후 발사) : ttest에는 2 개의 행이 있습니다. 업데이트 1 vac = ttest에서 선택 *; 엑스 --- 1 4 (2 줄) = ttest에서 삭제; 정보 : trigf (이전 해고) : ttest에는 2 개의 행이 있습니다. 정보 : trigf (이전 해고) : ttest에는 1 개의 행이 있습니다. 정보 : trigf (이후 발사) : ttest에는 0 행이 있습니다. 정보 : trigf (이후 발사) : ttest에는 0 행이 있습니다. ^^^^^^ 가시성에 대해 우리가 말한 것을 기억하십시오. 삭제 2 = ttest에서 * 선택 *; 엑스 --- (0 줄)
더 복잡한 예가 있습니다.SRC/TEST/Regress/Regress.Cand inSPI.