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)

행 수준 이벤트에 대해 롤 토토가 실행되면 true를 반환합니다.

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만일 그것이라면삽입또는 a삭제. 이벤트가 다음과 같은 경우 함수에서 반환해야 하는 내용입니다.업데이트그리고 당신은 이 행을 다른 행으로 교체하거나 작업을 건너뛰기를 원하지 않습니다. 외부 테이블에 대한 롤 토토의 경우 여기에 있는 시스템 열의 값은 지정되지 않습니다.

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, 작업 중인 행을 수정하지 않으려는 경우 적절합니다.

수정사항 제출

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