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

16.4. 예

더 복잡한 예가 있습니다.SRC/TEST/Regress/Regress.Cand inContrib/SPI.

트리거 사용의 매우 간단한 예는 다음과 같습니다. 기능trigf튜플 수를보고합니다 트리거 된 관계에서토토 사이트 순위및 쿼리가 널 값을 삽입하려는 경우 작업을 건너 뜁니다. 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 (info, "trigf (fired %s) : spi_connect가 반환 된 %d", 언제, ret);

    / * 관련 튜플 수를 얻으십시오 */
    ret = spi_exec ( "토토 사이트 순위에서 count (*) 선택", 0);

    if (ret <0)
        elog (통지, "trigf (fired %s) : spi_exec이 %d를 반환 할 때, ret);

    /*count (*) Pg 7.2에서 int8을 반환하므로 변환에주의하십시오*/
    i = (int) datumgetint64 (spi_getbinval (spi_tuptable- vals [0],
                                          spi_tuptable- tupdesc,
                                          1,
                                          & isnull);

    elog (통지, "trigf (발사 %s) : 토토 사이트 순위에는 %d 튜플이 있습니다", 언제, i);

    spi_finish ();

    if (checknull)

        (void) spi_getbinval (rettuple, tupdesc, 1, & isnull);
        if (isnull)
            rettuple = null;

    반환 pointergetDatum (rettuple);

이제 트리거 함수를 컴파일하고 만듭니다.

함수 만들기 trigf () 트리거를 반환합니다 
'... path_to_so'언어 C;

테스트 생성 (x int4);
vac = 토토 사이트 순위에서 삽입 또는 업데이트 또는 삭제하기 전에 tbe 전에 트리거 생성 
각 행에 대해 절차를 실행합니다. Trigf ();
만들다
vac = 토토 사이트 순위에서 삽입 또는 업데이트 또는 삭제 후 Trigger Tafter 작성 
각 행에 대해 절차를 실행합니다. Trigf ();
만들다
Vac = 토토 사이트 순위 값 (null)에 삽입;
경고 : trigf (이전에 발사) : 토토 사이트 순위에는 0 개의 튜플이 있습니다.
0 0을 삽입하십시오

- 삽입을 건너 뛰고 트리거가 발사되지 않았습니다

vac = 토토 사이트 순위에서 선택 *;
 엑스
---
(0 줄)

Vac = 토토 사이트 순위 값에 삽입 (1);
정보 : trigf (이전에 발사) : 토토 사이트 순위에 0 개의 튜플이 있습니다.
정보 : trigf (후 발사) : 토토 사이트 순위에는 1 개의 튜플이 있습니다.
                                       ^^^^^^^^
                             가시성에 대해 우리가 말한 것을 기억하십시오.
삽입 167793 1
vac = 토토 사이트 순위에서 선택 *;
 엑스
---
 1
(1 줄)

vac = 토토 사이트 순위에 삽입하여 토토 사이트 순위에서 x * 2를 선택하십시오.
정보 : trigf (이전에 발사) : 토토 사이트 순위에 1 개의 튜플이 있습니다.
정보 : trigf (후 발사) : 토토 사이트 순위에는 2 개의 튜플이 있습니다.
                                       ^^^^^^^^
                             가시성에 대해 우리가 말한 것을 기억하십시오.
삽입 167794 1
vac = 토토 사이트 순위에서 선택 *;
 엑스
---
 1
 2
(2 줄)

Vac = 업데이트 토토 사이트 순위 set x = null 여기서 x = 2;
정보 : trigf (이전에 발사) : 토토 사이트 순위에 2 개의 튜플이 있습니다.
업데이트 0
Vac = 업데이트 토토 사이트 순위 set x = 4 여기서 x = 2;
정보 : trigf (이전에 발사) : 토토 사이트 순위에 2 개의 튜플이 있습니다.
정보 : trigf (후 발사) : 토토 사이트 순위에는 2 개의 튜플이 있습니다.
업데이트 1
vac = 토토 사이트 순위에서 선택 *;
 엑스
---
 1
 4
(2 줄)

vac = 토토 사이트 순위에서 삭제;
정보 : trigf (이전에 발사) : 토토 사이트 순위에 2 개의 튜플이 있습니다.
정보 : trigf (후 발사) : 토토 사이트 순위에는 1 개의 튜플이 있습니다.
정보 : trigf (이전에 발사) : 토토 사이트 순위에 1 개의 튜플이 있습니다.
정보 : trigf (이후에 발사) : 토토 사이트 순위에는 0 개의 튜플이 있습니다.
                                       ^^^^^^^^
                             가시성에 대해 우리가 말한 것을 기억하십시오.
삭제 2
vac = 토토 사이트 순위에서 선택 *;
 엑스
---
(0 줄)