トリガーの代替手段

SQL Server のトリガー構築と最適化

Florin Angelescu

Instructor

トリガー vs. ストアドプロシージャ

トリガー

  • あるイベントで自動実行
-- INSERT トリガーが発火
INSERT INTO Orders [...];
  • パラメーターやトランザクションは不可
  • 値を戻り値として返せない

ストアドプロシージャ

  • 明示的に呼び出したときのみ実行
-- ストアドプロシージャを実行
EXECUTE sp_DailyMaintenance;
  • 入力パラメーターとトランザクションを受け付ける
  • 値を戻り値として返せる
SQL Server のトリガー構築と最適化

トリガー vs. ストアドプロシージャ

トリガー

用途:

  • 監査
  • 整合性の強制

ストアドプロシージャ

用途:

  • 汎用タスク
  • ユーザー固有の要件
SQL Server のトリガー構築と最適化

トリガー vs. 計算列

トリガー

  • 列値を計算
  • 計算に他テーブルの列を使用可能
  • 計算は INSERT または UPDATE 時に実行
    -- トリガー内で使用
    [...]
    UPDATE
    SET TotalAmount = Price * Quantity
    [...]
    

計算列

  • 列値を計算
  • 計算に使えるのは同一テーブルの列のみ
  • テーブル作成時に計算式を定義
    -- 列の定義
    [...]
    TotalAmount AS Price * Quantity
    [...]
    
SQL Server のトリガー構築と最適化

計算列の例

CREATE TABLE [SalesWithPrice]
(
    [OrderID] INT IDENTITY(1,1),
    [Customer] NVARCHAR(50),
    [Product] NVARCHAR(50),
    [Price] DECIMAL(10,2),
    [Currency] NVARCHAR(3),
    [Quantity] INT,
    [OrderDate] DATE DEFAULT (GETDATE()),
    [TotalAmount] AS [Quantity] * [Price]
);
SQL Server のトリガー構築と最適化

計算列としてトリガーを使う

CREATE TRIGGER [SalesCalculateTotalAmount]
ON [SalesWithoutPrice]
AFTER INSERT
AS
    UPDATE [sp]
    SET [sp].[TotalAmount] = [sp].[Quantity] * [p].[Price]
    FROM [SalesWithoutPrice] AS [sp]
    INNER JOIN [Products] AS [p] ON [sp].Product = [p].[Product]
    WHERE [sp].[TotalAmount] IS NULL;
SQL Server のトリガー構築と最適化

実際に比較してみましょう!

SQL Server のトリガー構築と最適化

Preparing Video For Download...