| 윈 토토 : 문서 : 9.4 : 윈 토토 | |||
|---|---|---|---|
| PostgreSQL : 문서 : 9.4 : C의 스포츠 토토 결과 기능 쓰기 | PostgreSQL : 문서 : 9.4 : 토토 | 36장. 배트맨 토토 | PostgreSQL : 문서 : 9.4 : 이벤트 토토 캔 | 
다음은 C로 작성된 트리거 함수의 매우 간단한 예입니다. (절차적 언어로 작성된 트리거의 예는 절차적 언어 문서에서 찾을 수 있습니다.)
함수trigf테이블의 행 수를 보고합니다.테스트명령이 열에 null 값을 삽입하려고 시도하면 실제 작업을 건너뜁니다.x. (따라서 배트맨 토토는 null이 아닌 제약 조건으로 작동하지만 트랜잭션을 중단하지는 않습니다.)
먼저, 테이블 정의:
테이블 생성 ttest(
    x 정수
);
이것은 트리거 함수의 소스 코드입니다:
#include "postgres.h"
#include "executor/spi.h" /* SPI로 작업하는 데 필요한 것 */
#include "commands/trigger.h" /* ... 트리거 ... */
#include "utils/rel.h" /* ... 및 관계 */
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
extern 데이텀 trigf(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(trigf);
데이텀
삼각(PG_FUNCTION_ARGS)
    TriggerData *trigdata = (TriggerData *) fcinfo-context;
    TupleDesc tupdesc;
    HeapTuple retuple;
    문자 *언제;
    부울 체크널 = 거짓;
    bool은 null입니다.
    int ret, i;
    /* 트리거로 호출되는지 확인하세요 */
    if (!CALLED_AS_TRIGGER(fcinfo))
        elog(ERROR, "trigf: 트리거 관리자가 호출하지 않았습니다.");
    /* 실행자로 돌아갈 튜플 */
    if (TRIGGER_FIRED_BY_UPDATE(trigdata-tg_event))
        rettuple = trigdata-tg_newtuple;
    그렇지 않으면
        rettuple = trigdata-tg_trigtuple;
    /* null 값을 확인하세요 */
    if (!TRIGGER_FIRED_BY_DELETE(trigdata-tg_event)
        && TRIGGER_FIRED_BEFORE(trigdata-tg_event))
        체크널 = 참;
    if (TRIGGER_FIRED_BEFORE(trigdata-tg_event))
        when = "이전";
    그렇지 않으면
        언제 = "이후";
    tupdesc = trigdata-tg_relation-rd_att;
    /* SPI 관리자에 연결 */
    if ((ret = SPI_connect()) < 0)
        elog(ERROR, "trigf(%s 실행): SPI_connect가 %d을(를) 반환했습니다.", when, ret);
    /* 테이블의 행 개수 가져오기 */
    ret = SPI_exec("SELECT count(*) FROM ttest", 0);
    만약 (ret < 0)
        elog(ERROR, "trigf(%s 실행): SPI_exec가 %d을(를) 반환했습니다.", when, ret);
    /* count(*)는 int8을 반환하므로 변환에 주의하세요 */
    i = DatumGetInt64(SPI_getbinval(SPI_tuptable-vals[0],
                                    SPI_tuptable-tupdesc,
                                    1,
                                    &isnull));
    elog(INFO, "trigf(%s 실행됨): ttest에 %d개의 행이 있습니다.", when, i);
    SPI_finish();
    if(체크널)
        SPI_getbinval(rettuple, tupdesc, 1, &isnull);
        만약 (isnull)
            리튜플 = NULL;
    return PointerGetDatum(retuple);
소스 코드를 컴파일한 후(참조섹션 35.9.6), 함수와 트리거를 선언합니다.
CREATE FUNCTION trigf() 반환 트리거
    그대로 '파일 이름'
    언어 C;
ttest에서 삽입, 업데이트 또는 삭제하기 전에 트리거를 생성하세요.
    각 행 실행 절차 trigf();
ttest에서 삽입, 업데이트 또는 삭제 후 트리거 태프터 생성
    각 행 실행 절차 trigf();
이제 트리거 작동을 테스트할 수 있습니다:
= ttest 값에 삽입(NULL);
INFO: trigf(이전에 실행됨): ttest에 0개의 행이 있습니다.
삽입 0 0
-- 삽입을 건너뛰고 AFTER 트리거가 실행되지 않습니다.
= SELECT * FROM ttest;
 엑스
---
(0행)
= 테스트 값에 삽입(1);
INFO: trigf(이전에 실행됨): ttest에 0개의 행이 있습니다.
INFO: trigf(다음 이후에 실행됨): ttest에 1개의 행이 있습니다.
                                       ^^^^^^^^
                             가시성에 관해 우리가 말한 것을 기억하십시오.
삽입 167793 1
vac= SELECT * FROM ttest;
 엑스
---
 1
(1줄)
= ttest에 삽입 SELECT x * 2 FROM ttest;
정보: trigf(이전에 실행됨): ttest에 1개의 행이 있습니다.
정보: trigf(다음 이후에 실행됨): ttest에 2개의 행이 있습니다.
                                       ^^^^^^
                             가시성에 관해 우리가 말한 것을 기억하십시오.
삽입 167794 1
= SELECT * FROM ttest;
 엑스
---
 1
 2
(2열)
= UPDATE ttest SET x = NULL WHERE x = 2;
정보: trigf(이전에 실행됨): ttest에 2개의 행이 있습니다.
업데이트 0
= 업데이트 ttest SET x = 4 WHERE x = 2;
정보: trigf(이전에 실행됨): ttest에 2개의 행이 있습니다.
정보: trigf(다음 이후에 실행됨): ttest에 2개의 행이 있습니다.
업데이트 1
vac= SELECT * FROM ttest;
 엑스
---
 1
 4
(2열)
= ttest에서 삭제;
정보: trigf(이전에 실행됨): ttest에 2개의 행이 있습니다.
정보: trigf(이전에 실행됨): ttest에 1개의 행이 있습니다.
INFO: trigf(다음 이후에 실행됨): ttest에 0개의 행이 있습니다.
INFO: trigf(다음 이후에 실행됨): ttest에 0개의 행이 있습니다.
                                       ^^^^^^
                             가시성에 관해 우리가 말한 것을 기억하십시오.
2 삭제
= SELECT * FROM ttest;
 엑스
---
(0행)
다음에 더 복잡한 예가 있습니다.src/test/regress/regress.c그리고토토 : 문서 : 9.4 : SPI.