トリガーの構造:BEFORE/AFTER、FOR EACH ROW
トリガーの実行タイミング、粒度(行単位と文単位)、そしてトリガー関数内でのNEWとOLDの意味を理解します。
「トリガーの構造:BEFORE/AFTER、FOR EACH ROW」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
トリガーとは
トリガーとは、テーブルに対する INSERT、UPDATE、DELETE、または TRUNCATE の前後に、データベースが自動的に呼び出す関数です。
2つの要素:関数とトリガー
trigger を返す関数を作成し、それをテーブルに関連付けます。
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at := NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_set_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION set_updated_at();BEFOREとAFTER
- BEFORE — 行が書き込まれる前に実行され、NEW を変更できる
- AFTER — 書き込み後に実行され、副作用(監査や通知)に使う
FOR EACH ROWとFOR EACH STATEMENT
- FOR EACH ROW — 影響を受ける行ごとに1回実行され、
NEWとOLDを利用できる - FOR EACH STATEMENT — ステートメントごとに1回実行され、行単位のアクセスはできない
NEWとOLD
行トリガーの内部では次のようになります。
NEW— 新しい行(INSERT、UPDATE)OLD— 変更前の行(UPDATE、DELETE)
戻り値が重要
BEFORE行トリガーでは次のようにします。
NEWを返すと、その行の処理を続行する- 変更した
NEWを返すと、保存される内容を変更する NULLを返すと、その行に対する操作をキャンセルする
WHENフィルター
条件付きで実行します。
CREATE TRIGGER trg_log_status
AFTER UPDATE OF status ON orders
FOR EACH ROW WHEN (OLD.status IS DISTINCT FROM NEW.status)
EXECUTE FUNCTION log_status_change();OF column
BEFORE/AFTER UPDATE は、特定の列が変更された場合にのみ実行できます。
CREATE TRIGGER ... AFTER UPDATE OF status ON orders ...複数のトリガー
トリガーは、トリガー名のアルファベット順に実行されます。プレフィックス(00_、10_、...)を使って順序を制御してください。
トリガーのパフォーマンス
行トリガーは行ごとに実行されます。行トリガー内の重い処理 × 大量のDMLは、処理を遅くします。大量の副作用には、ステートメントトリガーを優先してください。
トリガーの無効化
一時的にスキップします。
ALTER TABLE orders DISABLE TRIGGER trg_audit;
-- bulk load...
ALTER TABLE orders ENABLE TRIGGER trg_audit;
-- Disable ALL triggers (use carefully):
ALTER TABLE orders DISABLE TRIGGER ALL;トリガーの再帰
同じテーブルに対するトリガー内の UPDATE は、再びそのトリガーを実行します。ガード(pg_trigger_depth())を使うか、慎重に設計してください。
まとめ
トリガーは、行ごとの反応を自動化します。
- TRIGGER を返す関数 + CREATE TRIGGER
- 変更には BEFORE、副作用には AFTER
- 行へのアクセスには NEW/OLD
- 選択性を高めるには WHEN と OF column
クイックチェック
すべての行が変更されるたびに、updated_at 列を自動更新したいとします。どのトリガー設定を使いますか。
よくある質問
「トリガーの構造:BEFORE/AFTER、FOR EACH ROW」レッスンは無料ですか?
はい。「トリガーの構造:BEFORE/AFTER、FOR EACH ROW」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「トリガーの構造:BEFORE/AFTER、FOR EACH ROW」で何を学びますか?
トリガーの実行タイミング、粒度(行単位と文単位)、そしてトリガー関数内でのNEWとOLDの意味を理解します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「トリガーの構造:BEFORE/AFTER、FOR EACH ROW」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- トリガーの構造:BEFORE/AFTER、FOR EACH ROW
- PL/pgSQL関数の基礎
- DOブロックと匿名コード
- トリガーによるテーブル監査