SQL Serverのトリガーは、データベースに対する特定の操作(INSERT、UPDATE、DELETE)が実行されたときに、自動的に呼び出される特殊なストアドプロシージャです。
トリガーを利用することで、データの整合性を保つためのカスタムロジックを実行したり、操作履歴を記録することが可能です。
トリガーの概要と用途
トリガーは、データ操作に関連するイベントに応じて自動的に実行されるデータベースオブジェクトです。以下のようなシナリオで役立ちます。
- データの履歴を記録する
- 操作後にデータを検証する
- 他のテーブルに影響を与えるロジックを実行する
ただし、トリガーを使いすぎるとパフォーマンスに影響する可能性があるため、適切な設計が必要です。
CREATE TRIGGER構文
SQL Serverでトリガーを作成する基本構文は次の通りです。
CREATE TRIGGER トリガー名
ON テーブル名
AFTER [INSERT, UPDATE, DELETE]
AS
BEGIN
-- 実行したいロジック
END
- トリガー名: 一意の名前を付けます。
- テーブル名: トリガーを関連付ける対象のテーブル。
- AFTER: 指定されたイベント(INSERT, UPDATE, DELETE)の後に実行。
- BEGIN…END: 実行するロジックを記述。
AFTER INSERT, AFTER UPDATE, AFTER DELETEトリガーの実例
AFTER INSERTトリガー
新しいデータが挿入された際に呼び出されるトリガーを作成します。
シナリオ
Employeesテーブルに新しい従業員が追加された際、変更内容をAuditLogテーブルに記録します。
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(100),
Department NVARCHAR(100),
HireDate DATE
);
CREATE TABLE AuditLog (
LogID INT IDENTITY(1,1) PRIMARY KEY,
Action NVARCHAR(50),
EmployeeID INT,
ChangeDate DATETIME
);
CREATE TRIGGER trg_AfterInsert_Employees
ON Employees
AFTER INSERT
AS
BEGIN
INSERT INTO AuditLog (Action, EmployeeID, ChangeDate)
SELECT 'INSERT', EmployeeID, GETDATE()
FROM inserted;
END;
AFTER UPDATEトリガー
データが更新された際に呼び出されるトリガーです。
シナリオ
従業員の部署が更新された場合に、変更前後のデータを記録します。
CREATE TABLE DepartmentChanges (
ChangeID INT IDENTITY(1,1) PRIMARY KEY,
EmployeeID INT,
OldDepartment NVARCHAR(100),
NewDepartment NVARCHAR(100),
ChangeDate DATETIME
);
CREATE TRIGGER trg_AfterUpdate_Employees
ON Employees
AFTER UPDATE
AS
BEGIN
INSERT INTO DepartmentChanges (EmployeeID, OldDepartment, NewDepartment, ChangeDate)
SELECT
d.EmployeeID,
d.Department AS OldDepartment,
i.Department AS NewDepartment,
GETDATE()
FROM deleted d
INNER JOIN inserted i
ON d.EmployeeID = i.EmployeeID;
END;
AFTER DELETEトリガー
データが削除された際に呼び出されるトリガーです。
シナリオ
従業員が削除された場合にその情報をログに記録します。
CREATE TRIGGER trg_AfterDelete_Employees
ON Employees
AFTER DELETE
AS
BEGIN
INSERT INTO AuditLog (Action, EmployeeID, ChangeDate)
SELECT 'DELETE', EmployeeID, GETDATE()
FROM deleted;
END;
演習問題
学んだ内容を基に以下の演習問題に挑戦してみましょう。
演習問題1
Productsテーブルに対して以下の要件を満たすトリガーを作成してください。
- 新しい商品が追加された場合、ProductLogテーブルに挿入内容を記録する。
演習問題2
Ordersテーブルで注文ステータスが更新された際に、OrderHistoryテーブルに変更履歴を記録するトリガーを作成してください。
解答例
解答例1
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(100),
Price DECIMAL(10, 2)
);
CREATE TABLE ProductLog (
LogID INT IDENTITY(1,1) PRIMARY KEY,
Action NVARCHAR(50),
ProductID INT,
ProductName NVARCHAR(100),
Price DECIMAL(10, 2),
ChangeDate DATETIME
);
CREATE TRIGGER trg_AfterInsert_Products
ON Products
AFTER INSERT
AS
BEGIN
INSERT INTO ProductLog (Action, ProductID, ProductName, Price, ChangeDate)
SELECT 'INSERT', ProductID, ProductName, Price, GETDATE()
FROM inserted;
END;
解答例2
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
Status NVARCHAR(50)
);
CREATE TABLE OrderHistory (
HistoryID INT IDENTITY(1,1) PRIMARY KEY,
OrderID INT,
OldStatus NVARCHAR(50),
NewStatus NVARCHAR(50),
ChangeDate DATETIME
);
CREATE TRIGGER trg_AfterUpdate_Orders
ON Orders
AFTER UPDATE
AS
BEGIN
INSERT INTO OrderHistory (OrderID, OldStatus, NewStatus, ChangeDate)
SELECT
d.OrderID,
d.Status AS OldStatus,
i.Status AS NewStatus,
GETDATE()
FROM deleted d
INNER JOIN inserted i
ON d.OrderID = i.OrderID;
END;
まとめ
この記事では、SQL Serverのトリガーを活用する方法を解説しました。
AFTER INSERT, UPDATE, DELETEの各トリガーを学ぶことで、データベース操作の監視やデータ変更の記録ができるようになります。
トリガーを使う際はパフォーマンスや設計を意識し、適切な場面で利用しましょう。