SQLServerのトリガーを作ってみた

皆さん、こんにちは!

Package Service Divisionに所属している新卒エンジニアのトゥアンです。

今回は開発で初めて作った「SQLServerのトリガー」について紹介したいと思います!

1. トリガとは

「トリガー」とはテーブルに対するデータ操作文(InsertやUpdate, Delete)をきっかけに自動的に実行される機能のことです。

今まで作ったことなく、商品を登録する際に関連するテーブルを一緒に更新するSQL用意して対応していました。

2. 実際のSQLの例

例えば、商品を登録する際に自動的に在庫を1として登録したいという要求があるとします。その場合、新たな商品が作成されたことをきっかけに在庫を登録するトリガーを定義することで上記の要求を実現することができます。

それでは続いて、実際のSQLを作成してみましょう!

-- 商品テーブル
CREATE TABLE tbl_Product
(
	product_id NVARCHAR(20) NOT NULL PRIMARY KEY,
	product_name  NVARCHAR(20),
	display_price DECIMAL(18,0)
)
-- 商品在庫テーブル
CREATE TABLE tbl_ProductStock
(
	product_id NVARCHAR(20) NOT NULL PRIMARY KEY,
	stock INT
)

トリガーの作成SQLです。

-- INSERTの商品在庫登録用
CREATE TRIGGER [dbo].[AddProductStockTr]
ON [dbo].[tbl_Product]
AFTER INSERT
AS
BEGIN
	-- 商品在庫登録
	INSERT tbl_ProductStock
	(
		product_id,
		stock
	)
 --在庫を1として割り振る
	SELECT	product_id,
			  1
	FROM	inserted
	WHERE	NOT EXISTS
			(
				SELECT *
				FROM tbl_ProductStock
				WHERE tbl_ProductStock.product_id = inserted.product_id
			)
END

3. トリガーテスト

まずは、トリガーが仕様通りの挙動となっていることを確かめましょう!

tbl_Productテーブルに行を追加すると以下のようになります。

INSERT INTO tbl_Product
	(product_id, product_name, display_price)
VALUES
	('0001', N'テレビ', '26000'),
	('0002', N'パソコン', '52000'),
	('0003', N'冷蔵庫', '65000')

商品テーブルにデータが挿入されます。

商品在庫テーブルが自動で1として登録されています。

仕様を満たした挙動となっていることが、なんとなく理解できるのではないでしょうか。データベース側だけで自動的なデータ操作が可能となり、便利そうな気がしますね。

トリガーで実行したSQLでエラーが発生するとトランザクションの状況によってはロールバックが発生し、メインテーブルの変更も無効になったりするので注意が必要です。

4. おわりに

ここまで、私が初めて作成したSQLServerのトリガーについて紹介してきました。

一見便利そうなトリガーですが、使う際に意識すべきことは「データベースにビジネスロジック持たせる」という点です。アプリ側でロジックを変更してもデータベース側も修正する必要が出てきます。ただ、保守性を考慮した上で設計をすれば、運用中に大きな問題が出ないでしょう。

関連記事

プロジェクトストーリー

技術

コメント

この記事へのコメントはありません。

カテゴリー

TOP
TOP