【PostgreSQL】トリガーを活用しよう!基礎から解説

※ この記事にはアフィリエイトリンクが含まれます

データベースを運用していると、ある操作に対して自動で処理を行いたいケースが多々あります。例えば、データが挿入されたタイミングでログを記録したり、更新時に履歴を残したりするような場面です。このような自動処理を可能にする仕組みがトリガーです。

トリガーとは、データベースにおける特定の操作(例: INSERT、UPDATE、DELETE)が行われた際に、自動的に呼び出される仕組みです。PostgreSQLでは、このトリガー機能を使って、さまざまな処理を自動化できます。例えば、以下のような用途で役立ちます。

  • データの一貫性を確保する
  • ログを自動で記録する
  • 特定の条件下でデータを自動補正する

本記事では、PostgreSQLにおけるトリガーの基本的な仕組みから実際の使い方までを分かりやすく解説します。初めてトリガーを使う方でも、この記事を読めばトリガーの作成・活用方法が理解できるでしょう。

トリガーの基本構造

トリガーは、特定のイベントが発生したときに、自動的に処理を実行する仕組みです。PostgreSQLのトリガー機能を理解するためには、その基本構造を押さえることが重要です。ここでは、トリガーの基本的な仕組みや構成要素について解説します。

トリガーイベント

トリガーイベントは、PostgreSQLでトリガーを発動させるきっかけとなる操作(イベント)を指します。特定のテーブルに対してこれらの操作が実行されると、それに応じて設定したトリガーが動作します。トリガーイベントには以下の種類があります。

  1. INSERT
    新しいレコードがテーブルに挿入されるときにトリガーを発動します。
    例: 新規データが追加された際に、ログを記録する。
  2. UPDATE
    既存のレコードが更新されるときにトリガーを発動します。
    例: 値の変更履歴を別テーブルに記録する。
  3. DELETE
    レコードが削除されるときにトリガーを発動します。
    例: 削除されたデータを別のテーブルにバックアップとして保存する。
  4. TRUNCATE
    テーブル全体が削除(TRUNCATE操作)されるときにトリガーを発動します。
    ※ TRUNCATEをトリガーするには、PostgreSQL 13以降が必要です。

トリガータイミング

トリガータイミングは、トリガーが実行されるタイミングを指定する設定です。特定のイベント(INSERT、UPDATE、DELETEなど)が発生した際に、そのイベントの前に処理を行うのか、に処理を行うのかを選択できます。また、一部の特別なタイミングも設定可能です。

BEFORE

イベントが発生する「前」にトリガーが実行されます。

  • 主にデータの検証や加工を行う場合に使用します。
  • トリガー内でデータの値を変更することで、テーブルに保存される値を調整できます。
    例: データ挿入時にカラムにデフォルト値を自動設定する。

サンプルコード:BEFOREトリガー

CREATE OR REPLACE FUNCTION set_default_value()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.column_name IS NULL THEN
        NEW.column_name := 'default_value';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON your_table
FOR EACH ROW
EXECUTE FUNCTION set_default_value();

AFTER

イベントが発生した「後」にトリガーが実行されます。

  • 主にデータ変更後の処理やログ記録に使用します。
  • テーブルにデータが実際に保存された後であるため、他のテーブルへのデータ書き込みや、外部システムとの連携などが行いやすいです。
    例: データが更新された後、変更履歴を別テーブルに保存する。

サンプルコード:AFTERトリガー

CREATE OR REPLACE FUNCTION log_changes()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO history_table (table_name, operation, changed_at)
    VALUES (TG_TABLE_NAME, TG_OP, NOW());
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_update_trigger
AFTER UPDATE ON your_table
FOR EACH ROW
EXECUTE FUNCTION log_changes();

INSTEAD OF

特定のイベントが発生した際に、そのイベントを実行する代わりにトリガー処理を行います。

  • 主にビューに対して使用されます。
  • 通常、ビューは直接操作できませんが、INSTEAD OFトリガーを設定することで、間接的にINSERTやUPDATEなどを実現できます。
    例: ビューに対する挿入操作を基に、基盤となる複数のテーブルを操作する。

サンプルコード:INSTEAD OFトリガー

CREATE OR REPLACE FUNCTION manage_view_insert()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO base_table1 (col1, col2) VALUES (NEW.col1, NEW.col2);
    INSERT INTO base_table2 (col3) VALUES (NEW.col3);
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER instead_of_insert_trigger
INSTEAD OF INSERT ON your_view
FOR EACH ROW
EXECUTE FUNCTION manage_view_insert();

トリガーの作成について

PostgreSQLでトリガーを作成する際には、トリガー関数トリガーの2つを定義する必要があります。以下では、それぞれの作成手順を詳しく解説します。

トリガー関数の作成

トリガー関数は、トリガーが発動した際に実行される処理を記述する関数です。PostgreSQLでは主にPL/pgSQLを使用して記述しますが、他の言語(Python、Perlなど)を利用することも可能です。

基本構文

CREATE OR REPLACE FUNCTION 関数名()
RETURNS TRIGGER AS $$
BEGIN
    -- 処理内容
    RETURN NEW; -- または RETURN OLD;
END;
$$ LANGUAGE plpgsql;

例として、INSERT操作時にログを記録する関数を紹介します。

CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO logs (table_name, operation, executed_at)
    VALUES (TG_TABLE_NAME, TG_OP, NOW());
    RETURN NEW; -- INSERT/UPDATE用(新しいデータを返す)
END;
$$ LANGUAGE plpgsql;

トリガーの作成

トリガーを作成することで、特定のテーブルに対する操作が実行された際に、指定したトリガー関数を呼び出します。

基本構文

CREATE TRIGGER トリガー名
タイミング イベント ON 対象テーブル
FOR EACH ROW
EXECUTE FUNCTION 関数名();

INSERT時にトリガーを実行する場合は、以下のように書きます。

CREATE TRIGGER log_trigger
AFTER INSERT ON your_table
FOR EACH ROW
EXECUTE FUNCTION log_insert();

以上の手順で、PostgreSQLのトリガーを簡単に作成・活用できます。

トリガーの使用例

トリガーは、データベース内での自動処理を実現する強力な仕組みです。ここでは、具体的なユースケースを基に、PostgreSQLのトリガーをどのように活用できるかを詳しく紹介します。

ログ記録の自動化

ユースケース:テーブルに対するINSERTUPDATE操作の履歴を記録したい。
: productsテーブルの更新時に変更内容をproduct_logsテーブルへ記録。

ログテーブル

CREATE TABLE product_logs (
    id SERIAL PRIMARY KEY,
    product_id INT,
    old_price NUMERIC,
    new_price NUMERIC,
    changed_at TIMESTAMP
);

トリガー関数の作成

CREATE OR REPLACE FUNCTION log_product_updates()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO product_logs (product_id, old_price, new_price, changed_at)
    VALUES (OLD.id, OLD.price, NEW.price, NOW());
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

トリガーの作成

CREATE TRIGGER product_update_logger
AFTER UPDATE OF price ON products
FOR EACH ROW
EXECUTE FUNCTION log_product_updates();

productsテーブルのpriceカラムを更新すると、変更履歴がproduct_logsに記録されます。

まとめ

PostgreSQLのトリガーは、データベース内で自動化処理を実現する非常に強力な機能です。本記事では、トリガーの基本的な構成要素であるトリガーイベントトリガータイミング、および具体的な作成手順を解説し、実際のユースケースを通じてその活用例を紹介しました。

PostgreSQLのトリガーは、システムの規模や要件に応じて柔軟に適用できる機能です。この記事を参考に、必要なトリガーを設計・実装し、データベース操作をより効率的で信頼性の高いものにする手助けとなれば幸いです。

コメント