【PL/SQL】トリガーを作成する方法と具体例

【PL/SQL】トリガーを作成する方法と具体例 PL/SQL

OracleのPL/SQLでは、トリガー(Trigger)を用いて、テーブルのデータ変更(INSERT、UPDATE、DELETE)に自動的に反応して処理を実行することが可能です。この記事では、PL/SQLでのトリガーの作成方法と、よく使われる実用的な具体例を紹介します。

トリガーとは?

トリガーとは、特定のデータ操作イベント(DML:INSERT、UPDATE、DELETE)を契機に自動的に実行されるPL/SQLプログラムです。例えば、「従業員テーブルに新しいデータが追加されたらログを記録する」といった処理をトリガーで実現できます。

トリガーの基本構文

CREATE OR REPLACE TRIGGER トリガー名
{BEFORE | AFTER | INSTEAD OF} INSERT OR UPDATE OR DELETE
ON テーブル名
[FOR EACH ROW]
DECLARE
  -- 変数宣言など
BEGIN
  -- 実行したい処理
END;

BEFORE
処理の前に実行

AFTER
処理の後に実行

FOR EACH ROW
1行ずつ処理する(行レベルトリガー)

具体例① INSERT時にログを記録するトリガー

以下の例では、employeesテーブルに新しいレコードが追加された際、employee_logテーブルにログを自動で記録します。

ログ用テーブルの作成

CREATE TABLE employee_log (
  log_id     NUMBER PRIMARY KEY,
  emp_id     NUMBER,
  action     VARCHAR2(20),
  log_date   DATE
);

トリガーの作成

CREATE OR REPLACE TRIGGER trg_employees_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
  INSERT INTO employee_log (log_id, emp_id, action, log_date)
  VALUES (employee_log_seq.NEXTVAL, :NEW.emp_id, 'INSERT', SYSDATE);
END;
  • :NEW.emp_id は追加された行の値を参照するPL/SQLの記法です。
  • employee_log_seq はシーケンス(連番生成)で、事前に作成しておきます。

具体例② 更新前後の給与差を記録するトリガー

CREATE OR REPLACE TRIGGER trg_employees_salary_update
AFTER UPDATE OF salary ON employees
FOR EACH ROW
WHEN (OLD.salary <> NEW.salary)
BEGIN
  INSERT INTO employee_log (log_id, emp_id, action, log_date)
  VALUES (employee_log_seq.NEXTVAL, :NEW.emp_id, 
          'SALARY CHANGE: ' || :OLD.salary || ' → ' || :NEW.salary,
          SYSDATE);
END;
  • :OLD.salary は更新前の値、:NEW.salary は更新後の値を意味します。
  • WHEN句で給与が変わったときだけトリガーが動作するよう制御しています。

注意点

  • トリガーは自動で実行されるため、処理が重いとパフォーマンスに影響します。
  • 複数のトリガーが連鎖的に発火する可能性があるため、ロジックは慎重に設計しましょう。
  • AFTERではトランザクションが完了してから処理されるため、エラーが起きた場合にロールバックが困難なケースもあります。

まとめ

PL/SQLトリガーは、データベースの変更に対して自動で処理を走らせる強力な仕組みです。ログ記録やデータ整合性の維持など、様々な場面で活用できます。業務システムにおいては、トリガーの使いすぎによる複雑化には注意しつつ、適切に設計・活用しましょう。