0Pricing
SQL Academy · レッスン

トリガーの構造: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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. トリガーの構造:BEFORE/AFTER、FOR EACH ROW
  2. PL/pgSQL関数の基礎
  3. DOブロックと匿名コード
  4. トリガーによるテーブル監査
← SQL Academyに戻る