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
orFOR 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(デフォルト)
トリガー関数に依存しているトリガーやオブジェクトが存在する場合は削除しません。エラーメッセージを表示します。