37.3. C에서 사설 토토 함수 작성#

이 섹션에서는 사설 토토 기능 인터페이스의 하위 수준 세부정보를 설명합니다. 이 정보는 C에서 사설 토토 함수를 작성할 때만 필요합니다. 고급 언어를 사용하는 경우 이러한 세부 정보가 자동으로 처리됩니다. 대부분의 경우 C로 사설 토토를 작성하기 전에 절차적 언어 사용을 고려해야 합니다. 각 절차적 언어 문서에는 해당 언어로 사설 토토를 작성하는 방법이 설명되어 있습니다.

사설 토토 기능은 다음을 사용해야 합니다.버전 1함수 관리자 인터페이스.

사설 토토 관리자가 함수를 호출하면 일반 인수가 전달되지 않지만 a가 전달됩니다.컨텍스트a를 가리키는 포인터사설 토토데이터구조. C 함수는 매크로를 실행하여 사설 토토 관리자에서 호출되었는지 여부를 확인할 수 있습니다.

CALLED_AS_TRIGGER(fcinfo)

다음으로 확장:

((fcinfo)-컨텍스트 != NULL && IsA((fcinfo)-컨텍스트, TriggerData))

이것이 true를 반환하면 전송하는 것이 안전합니다.fcinfo-컨텍스트입력하려면사설 토토데이터 *그리고 가리키는 것을 활용사설 토토데이터구조. 이 기능은 다음과 같아야 합니다.아님변경사설 토토데이터구조 또는 그것이 가리키는 데이터.

구조 TriggerData다음에 정의됨명령/trigger.h:

typedef 구조체 TriggerData

    NodeTag 유형;
    TriggerEvent tg_event;
    관계 tg_relation;
    힙튜플 tg_trigtuple;
    힙튜플 tg_newtuple;
    사설 토토 *tg_trigger;
    TupleTableSlot *tg_trigslot;
    TupleTableSlot *tg_newslot;
    Tuplestorestate *tg_oldtable;
    Tuplestorestate *tg_newtable;
    const 비트맵 세트 *tg_updatedcols;
 TriggerData;

여기서 구성원은 다음과 같이 정의됩니다:

유형

항상T_TriggerData.

tg_event

함수가 호출되는 이벤트를 설명합니다. 다음 매크로를 사용하여 조사할 수 있습니다.tg_event:

TRIGGER_FIRED_BEFORE(tg_event)

작업 전에 사설 토토가 실행되면 참을 반환합니다.

TRIGGER_FIRED_AFTER(tg_event)

작업 후 사설 토토가 실행되면 true를 반환합니다.

TRIGGER_FIRED_INSTEAD(tg_event)

작업 대신 사설 토토가 실행되면 참을 반환합니다.

TRIGGER_FIRED_FOR_ROW(tg_event)

행 수준 이벤트에 대해 사설 토토가 실행되면 참을 반환합니다.

TRIGGER_FIRED_FOR_STATEMENT(tg_event)

문 수준 이벤트에 대해 사설 토토가 실행되면 참을 반환합니다.

TRIGGER_FIRED_BY_INSERT(tg_event)

사설 토토가 다음에 의해 실행된 경우 참을 반환합니다.삽입명령.

TRIGGER_FIRED_BY_UPDATE(tg_event)

사설 토토가 다음에 의해 실행된 경우 참을 반환합니다.업데이트명령.

TRIGGER_FIRED_BY_DELETE(tg_event)

사설 토토가 다음에 의해 실행된 경우 참을 반환합니다.삭제명령.

TRIGGER_FIRED_BY_TRUNCATE(tg_event)

사설 토토가 다음에 의해 실행된 경우 참을 반환합니다.잘라내기명령.

tg_relation

사설 토토가 실행된 관계를 설명하는 구조에 대한 포인터입니다. 보세요utils/rel.h이 구조에 대한 자세한 내용을 확인하세요. 가장 흥미로운 점은 다음과 같습니다.tg_relation-rd_att(관계 튜플의 설명자) 및tg_relation-rd_rel-relname(관계 이름; 유형이 아님문자*하지만이름데이터; 사용SPI_getrelname(tg_relation)을 얻으려면문자*이름 사본이 필요한 경우).

tg_trigttuple

사설 토토가 실행된 행에 대한 포인터입니다. 삽입, 업데이트 또는 삭제되는 행입니다. 이 사설 토토가 다음에 대해 실행된 경우삽입또는삭제다음 행을 다른 행으로 바꾸지 않으려면 함수에서 반환해야 하는 내용입니다(의 경우삽입) 또는 작업을 건너뜁니다. 외부 테이블에 대한 사설 토토의 경우 여기에 있는 시스템 열의 값이 지정되지 않습니다.

tg_newtuple

사설 토토가 다음에 대해 실행된 경우 행의 새 버전에 대한 포인터업데이트NULL만일 그것이라면삽입또는삭제. 이벤트가 다음과 같은 경우 함수에서 반환해야 하는 내용입니다.업데이트그리고 당신은 이 행을 다른 행으로 교체하거나 작업을 건너뛰기를 원하지 않습니다. 외부 테이블에 대한 사설 토토의 경우 여기에 있는 시스템 열의 값은 지정되지 않습니다.

tg_trigger

유형의 구조에 대한 포인터사설 토토, 정의됨utils/reltrigger.h:

typedef 구조체 사설 토토

    이드 tgoid;
    char *tgname;
    Oid tgfoid;
    int16 tgtype;
    차트 활성화;
    bool tgisinternal;
    bool tgisclone;
    Oid tgconstrrelid;
    Oid tgconstrindid;
    Oid tg제약;
    bool tgdeferrable;
    bool tginitdeferred;
    int16 tgnars;
    int16 tgnattr;
    int16 *tgattr;
    char **tgargs;
    char *tgqual;
    char *tgoldtable;
    char *tgnewtable;
 방아쇠;

어디에서tgname사설 토토의 이름입니다.tgnars은의 인수 수입니다.tgargstgargs은에 지정된 인수에 대한 포인터 배열입니다.사설 토토 생성성명. 다른 구성원은 내부 전용입니다.

tg_trigslot

다음을 포함하는 슬롯tg_trigttuple또는 aNULL그러한 튜플이 없는 경우 포인터.

tg_newslot

다음을 포함하는 슬롯tg_newtuple또는 aNULL그러한 튜플이 없는 경우 포인터.

tg_oldtable

유형의 구조에 대한 포인터Tuplestorestate다음에 의해 지정된 형식으로 0개 이상의 행을 포함합니다.tg_relation또는 aNULL포인터가 없으면 포인터이전 테이블전환 관계.

tg_newtable

유형의 구조에 대한 포인터Tuplestorestate다음에 의해 지정된 형식으로 0개 이상의 행을 포함합니다.tg_relation또는 aNULL포인터가 없으면 포인터새 테이블전환 관계.

tg_updatedcols

업데이트사설 토토, 사설 토토 명령으로 업데이트된 열을 나타내는 비트맵 세트입니다. 일반 사설 토토 함수는 이를 사용하여 변경되지 않은 열을 처리할 필요 없이 작업을 최적화할 수 있습니다.

예를 들어 속성 번호가 있는 열인지 여부를 확인하려면attnum(1 기반)은 이 비트맵 집합의 구성원입니다. 호출bms_is_member(attnum - FirstLowInvalidHeapAttributeNumber, trigdata-tg_updatedcols)).

이외의 사설 토토의 경우업데이트사설 토토, 이것은 다음과 같습니다NULL.

SPI를 통해 발행된 쿼리가 전환 테이블을 참조하도록 허용하려면 다음을 참조하세요.SPI_register_trigger_data.

사설 토토 함수는 다음 중 하나를 반환해야 합니다.힙튜플포인터 또는 aNULL포인터 (아님SQL null 값, 즉 설정하지 않음isNull참). 다음 중 하나를 반환할 때는 주의하세요.tg_trigttuple또는tg_newtuple, 작업 중인 행을 수정하지 않으려는 경우 적절합니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.