이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다토토 꽁 머니 : 문서 : 17 : 37.4. 완전한 트리거 예버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

35.4. 토토 캔 예

여기에 작성된 트리거 함수의 매우 간단한 예입니다. C. (절차 언어로 작성된 트리거의 예는 절차 언어의 문서에서 찾을 수 있습니다.)

함수trigf보고서 테이블의 행 수토토 캔및 명령이 삽입하려고 시도하면 실제 작업을 건너 뜁니다. 열에 null 값x. (그래서 트리거는 널없는 구속 조건으로 작용하지만 거래.)

먼저 테이블 정의 :

테이블 생성 토토 캔 (
    x 정수
);

이것은 트리거 함수의 소스 코드입니다 :

#include "postgres.h"
#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;

    / * 전혀 방아쇠로 불리는지 확인 */
    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 (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 (*) int8을 반환하므로 변환에주의하십시오*/
    i = datumgetint64 (spi_getbinval (spi_tuptable- vals [0],
                                    spi_tuptable- tupdesc,
                                    1,
                                    & isnull);

    elog (info, "trigf (fired %s) : 토토 캔에는 %d 행이 있습니다", 언제, i);

    spi_finish ();

    if (checknull)

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

    반환 pointergetDatum (rettuple);

소스 코드를 컴파일 한 후에는 기능을 선언합니다. 그리고 트리거 :

함수 작성 trigf () 트리거를 반환합니다
    처럼 'filename'
    언어 C;

토토 캔에서 삽입하거나 업데이트하거나 삭제하기 전에 Trigger 작성 
    각 행에 대해 절차를 실행합니다. Trigf ();

토토 캔에서 삽입 또는 업데이트 또는 삭제 후 트리거 테이퍼를 만듭니다. 
    각 행에 대해 절차를 실행합니다. Trigf ();

이제 트리거 작업을 테스트 할 수 있습니다 :

= 토토 캔 값 (null)에 삽입;
정보 : trigf (이전 해고) : 토토 캔에는 0 행이 있습니다.
0 0을 삽입하십시오

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

= 토토 캔에서 * 선택 *;
 엑스
---
(0 줄)

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

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

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

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

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