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