【PostgreSQL】 SQL構文(DDL):トリガー(TRIGGER)

SQL構文(DDL):トリガー(TRIGGER)とは


特定のテーブルに対するイベント(INSERT, UPDATE, DELETE )が発生したときに、自動的に実行するカスタム関数(トリガー関数)を定義する機能です。


この機能によりデータの整合性を保ったり、イベントに基づいた自動処理を行う事ができます。


基本構文


CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF } { INSERT | UPDATE | DELETE | TRUNCATE }
ON table_name
[ FOR EACH { ROW | STATEMENT } ]
[ WHEN (condition) ]
EXECUTE FUNCTION trigger_function();


  • トリガー名(trigger_name)
    トリガーに名称を設定します。

  • タイミング (BEFORE, AFTER, INSTEAD OF)

    BEFORE:イベントが発生する前に、トリガー関数を実行します。
    AFTER:イベントが発生した後に、トリガー関数を実行します。
    INSTEAD OF:ビューで発生する INSERT, UPDATE, DELETE 操作を、トリガー関数に置き換えて実行します。

  • イベント (INSERT, UPDATE, DELETE, TRUNCATE)

    INSERT:新しい行が挿入された時
    UPDATE:既存の行が更新された時
    DELETE:行が削除された時。
    TRUNCATE:テーブルが空になった時

  • テーブル名 (table_name)
    トリガーが設定される対象のテーブル名

  • 実行単位 (FOR EACH ROW or FOR EACH STATEMENT)

    FOR EACH ROW:イベント発生毎にトリガーを実行する
    FOR EACH STATEMENT:イベントが発生した時、一度だけトリガーを実行する

  • 条件 (WHEN)
    トリガーが実行される条件を指定します。

  • 実行する関数 (EXECUTE FUNCTION)
    トリガー発生時に実行する関数を指定します。


トリガー関数の基本構文


トリガー関数は、標準のストアドプロシージャとは異なり、常に RETURNS TRIGGER を返す必要があります。

CREATE OR REPLACE FUNCTION trigger_function_name()
RETURNS TRIGGER AS $$
BEGIN
  -- 処理内容
  RETURN NEW; -- INSERT または UPDATE の場合に新しい行を返す
  -- RETURN OLD; -- DELETE の場合に古い行を返す
END;
$$ LANGUAGE plpgsql;


トリガーとトリガー関数の例


以下は、テーブルに行が挿入された際に、自動的にタイムスタンプを更新するトリガー関数とトリガーです。

users テーブルの行が INSERT もしくは UPDATE されるたびに、updated_at 列を自動的に更新します。

  • トリガー関数:update_timestamp
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at := NOW();  -- 新しいレコードの更新日を現在時刻に設定
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


  • トリガー:timestamp
CREATE TRIGGER set_timestamp
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_timestamp();



トリガーオプションの例


  • WHEN句を利用した、特定条件に基づいたトリガー関数の実行
    下記の例ではcolumn_name が変更された場合にのみ、トリガー関数(trigger_function())を実行します。


CREATE TRIGGER trigger_name
AFTER UPDATE ON table_name
FOR EACH ROW
WHEN (OLD.column_name IS DISTINCT FROM NEW.column_name)
EXECUTE FUNCTION trigger_function();


  • 複数のイベントに対するトリガー
    以下は、INSERT, UPDATE, DELETE の複数のイベントに対して、1つのトリガー(audit_trigger)を設定しています。


CREATE TRIGGER audit_trigger
AFTER INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
EXECUTE FUNCTION audit_log_function();


トリガーの削除


指定したテーブルからトリガーを削除します。


基本構文


DROP TRIGGER [ IF EXISTS ] trigger_name ON table_name [ CASCADE | RESTRICT ];


  • IF EXISTS
    指定したトリガーが存在する場合に、トリガーを削除します。
  • CASCADE
    トリガーに依存しているオブジェクト(例:ビューなど)も同時に削除します。
  • RESTRICT(デフォルト)
    トリガーに依存しているオブジェクトが存在する場合は削除しません。エラーメッセージを表示します。


トリガー関数の削除


トリガー関数は、通常の関数と同様に扱われるため、DROP FUNCTION コマンドを使用します。


基本構文


DROP FUNCTION [ IF EXISTS ] function_name (argument_types) [ CASCADE | RESTRICT ];


  • IF EXISTS
    指定したトリガー関数が存在する場合に、トリガーを削除します。
  • CASCADE
    トリガー関数に依存しているトリガーやオブジェクトも同時に削除します。
  • RESTRICT(デフォルト)
    トリガー関数に依存しているトリガーやオブジェクトが存在する場合は削除しません。エラーメッセージを表示します。
タイトルとURLをコピーしました