이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

21.4. 예

더 복잡한 예가 있습니다.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 줄)