TECH MEDIA

テックメディア


ノウハウ
ブログ

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

SQL Server
目次
  1. 01|はじめに
  2. 02|トリガとは
  3. 03|実際のSQLの例
  4. 04|トリガーテスト
  5. 05|おわりに

1. はじめに

皆さん、こんにちは!

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

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

2. トリガとは

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

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

3. 実際の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

 

4. トリガーテスト

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

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



INSERT INTO tbl_Product
(product_id, product_name, display_price)
VALUES
('0001', N'テレビ', '26000'),
('0002', N'パソコン', '52000'),
('0003', N'冷蔵庫', '65000')
商品テーブルにデータが挿入されます。

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

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

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

5. おわりに

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

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

RECRUIT 採用情報

「eビジネスに関わる全ての人を幸せにする」
私達とともに新たな時代をつくりませんか?