40.4. 완전한 이벤트 윈 토토 예#

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

함수noddl호출 할 때마다 예외가 제기됩니다. 이벤트 트리거 정의는 함수를와 연관시켰다.DDL_COMMAND_START이벤트. 효과는 모든 DDL 명령 (에 언급 된 예외와 함께입니다.PostgreSQL : 문서 : 16 : 40.1. 이벤트 롤 토토 동작 개요) 실행이 방지됩니다.

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

#include "postgres.h"
#include "명령/event_trigger.h"

PG_MODULE_MAGIC;

pg_function_info_v1 (noddl);

자료
noddl (pg_function_args)

    EventTriggerData *trigdata;

    if (! calling_as_event_trigger (fcinfo)) / * 내부 오류 * /
        elog (오류, "이벤트 트리거 관리자에 의해 발사되지 않음");

    trigdata = (EventTriggerData *) fcinfo- 컨텍스트;

    Ereport (오류,
            (errcode (errcode_insolficiter_privilege),
             errmsg ( "명령 \"%s \ "denied",
                    getCommandTagName (trigdata- tag)));

    pg_return_null ();

소스 코드를 컴파일 한 후 (참조섹션 38.10.5), 함수와 트리거를 선언합니다 :

함수 create noddl () repits event_trigger를 반환합니다
    'Noddl'언어 C;

DDL_COMMAND_START에서 이벤트 트리거 NODDL을 만듭니다
    함수 실행 noddl ();

이제 윈 토토 작업을 테스트 할 수 있습니다 :

=# \ dy
                     이벤트 트리거 목록
 이름 |       이벤트 | 소유자 | 활성화 | 기능 | 태그
-------+-------------------+-------+--------+----------+------
 noddl | DDL_COMMAND_START | 희미한 | 활성화 | noddl |
(1 줄)

=# 생성 테이블 foo (id serial);
오류 : 명령 "테이블 작성"거부

이 상황에서 DDL 명령을 실행하려면 이벤트 윈 토토를 떨어 뜨리거나 비활성화해야합니다. 트랜잭션 기간 동안 만 방아쇠를 비활성화하는 것이 편리 할 수 ​​있습니다.

시작;
Alter Event 윈 토토 NODDL 비활성화;
테이블 foo (id serial)를 만듭니다.
Alter Event 윈 토토 NODDL 활성화;
저지르다;

(이벤트 트리거 자체에 대한 DDL 명령이 이벤트 트리거의 영향을받지 않음을 기억하십시오.)

정정 제출

문서에 올바른 것이 없다면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면