PR

CREATE TRIGEER(トリガー)をわかりやすく3分で解説

Database

CREATE TRIGGER は、データベース内でトリガーを作成するためのSQL文です。

トリガーとは、指定されたイベント(INSERT / UPDATE / DELETE)が発生したときに自動的に実行されるストアドプロシージャのこと。

CREATE TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
BEGIN
  -- トリガーで実行されるアクション
END;

このページでは、トリガーって何?という方でもCREATE TRIGGER文を利用してトリガーを開発できるようにサンプルコード付きでわかりやすく解説します。

このページで学べる内容
  • トリガーとは?
  • CREATE TRIGGER文の使い方
  • トリガーの注意点

プログラマーやエンジニアを目指す方であれば知っておきたい基本知識の1つです。是非最後までご覧ください。

スポンサーリンク

【データベース】トリガーとは?

トリガーとは、データベースにおいて、特定のイベント(INSERT / UPDATE / DELETE)が発生したときに自動的に実行されるプログラムです。

create trigger

指定したテーブルに何らかの変更が入ったことを検知した場合に動くプログラム、と理解できればOKです。

実際のコードを見ていくと処理内容が理解しやすくなるので、さっそくトリガーの作成方法(CREATE TRIGGER)を見ていきましょう。

CREATE TRIGGER(トリガーの作成)

CREATE TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
BEGIN
  -- トリガーで実行されるアクション
END;

ポイントは以下の通り。

  • trigger_name
    作成するトリガーの名前を指定します。
  • trigger_time
    トリガーが実行されるタイミングを指定します。BEFOREまたはAFTERのいずれかを使用します。
  • trigger_event
    トリガーが実行されるイベントを指定します。①INSERT、②UPDATE、③DELETEのいずれかを選択します。
  • table_name
    監視するテーブルを指定します。
  • FOR EACH ROW
    トリガーがテーブル内の各行に対して実行されることを指定します。

実際の使用例を見ていきます。まず、前提として以下2つのテーブル「従業員テーブル(employees)」と「従業員の給与履歴テーブル(salary_history)」を用意します。

-- 従業員テーブル
CREATE TABLE employees (
  id INT AUTO_INCREMENT PRIMARY KEY,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  salary DECIMAL(10, 2)
);

-- 従業員の給与履歴テーブル
CREATE TABLE salary_history (
  id INT AUTO_INCREMENT PRIMARY KEY,
  employee_id INT,
  old_salary DECIMAL(10, 2),
  new_salary DECIMAL(10, 2),
  changed_at TIMESTAMP
);

参考:CREATE TABLE文

次に、従業員の給与が更新されたときに自動的に "salary_historyテーブル" に記録を追加するトリガーを作成します。

DELIMITER //
CREATE TRIGGER salary_change
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
  INSERT INTO salary_history (employee_id, old_salary, new_salary, changed_at)
  VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END; //
DELIMITER ;

このトリガーは、"employees" テーブルで "UPDATE" イベントが発生した後に実行され、給与が変更された従業員のID、古い給与、新しい給与、および変更日時をsalary_historyテーブルに挿入します。

実際に従業員の給与を更新して、トリガーが機能するかどうかを確認してみましょう。

-- 従業員の追加
INSERT INTO employees (first_name, last_name, salary)
VALUES ('John', 'Doe', 50000);

-- 従業員の給与を更新
UPDATE employees
SET salary = 55000
WHERE id = 1;

-- salary_historyテーブルの内容を確認
SELECT * FROM salary_history;

/* 結果(salary_historyテーブル に値が追加された)
+----+-------------+------------+------------+---------------------+
| id | employee_id | old_salary | new_salary | changed_at          |
+----+-------------+------------+------------+---------------------+
|  1 |           1 |   50000.00 |   55000.00 | 2023-03-17 14:52:10 |
+----+-------------+------------+------------+---------------------+
*/

ご覧のように、従業員の給与が更新されたときにsalary_changeトリガーが自動的に実行され、salary_historyテーブルに変更履歴が追加されます。このように、トリガーを使用することで、データベースの一貫性を維持し、追跡や監査が容易になります。

トリガーのメリット・デメリット

一見便利そうに見えるトリガーですが、メリットもあればデメリットもあります。

トリガーのメリット
  • データの整合性と一貫性
    トリガーは、データベース内のデータが一定の条件や制約を満たすことを自動的に保証するのに役立ちます。これにより、アプリケーション側でこれらの制約を実装する必要がなくなります。
  • 自動化
    トリガーは、データベース操作に対して自動的に実行されるため、開発者は特定のイベントに対して手動でアクションを実行する必要がありません。
  • セキュリティ向上
    トリガーを使用して、不正なデータの挿入や変更を防ぐことができます。これにより、データベースのセキュリティが向上します。
  • 監査と追跡
    トリガーを使用して、データベースの変更履歴を簡単に追跡・監査することができます。これにより、データの変更がいつ、どのように行われたかを確認しやすくなります。

一方でトリガーは以下のようなデメリットが存在します。

トリガーのデメリット
  • パフォーマンスへの影響
    トリガーが複雑で多数存在する場合、データベースのパフォーマンスに悪影響を与える可能性があります。トリガーは、関連するイベントが発生するたびに自動的に実行されるため、過剰な処理が発生することがあります。
  • 可読性とメンテナンス性の低下
    トリガーはデータベース内で隠れて動作するため、アプリケーションのコードからは直接的には見えません。これにより、コードの可読性やメンテナンス性が低下することがあります。
  • 複雑さの増加
    トリガーを多用することで、データベースの構造や動作が複雑になる可能性があります。これにより、デバッグやトラブルシューティングが困難になることがあります

個人的にはトリガー(trigger)は「それ以外の手段がない場合」にのみ利用する、というのがおすすめです。

トリガーを利用すると、業務ロジックがアプリケーション側とデータベース側に分かれて存在してしまうことになるため、一気にシステム全体の複雑性が増します。

どうしても、トリガーを利用しないといけない・・・という場合を除いて、基本的にはアプリケーション側での実装にするのがおすすめです。

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
blank
ビズドットオンライン
タイトルとURLをコピーしました