로그 테이블 및 트리거 함수 생성
이 단계에서는 DDL 이벤트 로깅에 필요한 데이터베이스 객체, 즉 로그를 저장할 테이블과 트리거가 실행할 함수를 생성합니다.
먼저 터미널을 열고 psql 대화형 쉘을 사용하여 PostgreSQL 데이터베이스에 연결합니다. 이후 SQL 작업은 이 쉘 내에서 수행합니다.
sudo -u postgres psql
이제 postgres=#와 같이 생긴 PostgreSQL 프롬프트가 표시됩니다.
다음으로 각 DDL 이벤트의 세부 정보를 저장할 event_log라는 테이블을 생성합니다. 이 테이블에는 이벤트 시간, 유형, 스키마, 객체 이름 및 실행된 명령에 대한 열이 있습니다.
psql 쉘에서 다음 SQL 명령을 실행합니다.
CREATE TABLE event_log (
event_time timestamp with time zone,
event_type text,
schema_name text,
object_name text,
command_tag text
);
성공적으로 실행되면 PostgreSQL 은 다음과 같이 응답합니다.
CREATE TABLE
이제 DDL 이벤트에 의해 트리거될 함수를 생성합니다. 이 함수인 log_ddl_event는 event_log 테이블에 새 레코드를 삽입합니다.
CREATE OR REPLACE FUNCTION log_ddl_event()
RETURNS event_trigger
AS $$
BEGIN
INSERT INTO event_log (event_time, event_type, schema_name, object_name, command_tag)
SELECT now(), tg_event, ddl_command.schema_name, ddl_command.objid::regclass, tg_tag
FROM pg_event_trigger_ddl_commands() AS ddl_command;
END;
$$ LANGUAGE plpgsql;
이 함수를 자세히 살펴보겠습니다.
RETURNS event_trigger: 이 함수가 이벤트 트리거와 함께 사용하도록 설계된 특수 함수 유형임을 지정합니다.
AS $$ ... $$ LANGUAGE plpgsql: plpgsql 절차 언어를 사용하여 함수 본문을 정의합니다.
INSERT INTO event_log ...: 이것이 핵심 작업으로, 로그 테이블에 새 행을 삽입합니다.
now(): 현재 타임스탬프를 반환하는 표준 함수입니다.
tg_event, tg_tag: 트리거 함수 내에서 사용할 수 있는 특수 변수로, ddl_command_end 및 CREATE TABLE과 같은 이벤트에 대한 컨텍스트를 제공합니다.
pg_event_trigger_ddl_commands(): 실행된 DDL 명령을 설명하는 행 집합을 반환하는 함수입니다. 이를 사용하여 생성 중인 객체의 schema_name 및 objid(객체 식별자) 를 가져옵니다.
명령을 실행한 후 다음과 같은 확인 메시지가 표시됩니다.
CREATE FUNCTION
이제 이벤트 트리거의 기본 구성 요소를 성공적으로 설정했습니다.