ログテーブルとトリガー関数の作成
このステップでは、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
これで、イベントトリガーの基盤となるコンポーネントを正常に設定できました。