MW211 EXIT

devlog
MSSQL/更新直後トリガで表を参照した場合
2014年11月24日
「AFTER UPDATE」の時に、「inserted」ではなく表を参照した場合、
参照が反映されているかをふと気になったので確認してみた。
  →結論:反映されている

【前準備】
┌──────────────────────────────────────┐
│CREATE DATABASE [実験DB];                                                   │
├──────────────────────────────────────┤
│CREATE TABLE [実験DB].[dbo].[T_実験] (                                      │
│    [キー]              [int]               NOT NULL,                       │
│    [値1]               [int]               NULL,                           │
│    [値2]               [int]               NULL,                           │
│    CONSTRAINT [PK_実験] PRIMARY KEY CLUSTERED (                            │
│        [キー]                ASC                                           │
│    )                                                                       │
│);                                                                          │
├──────────────────────────────────────┤
│CREATE VIEW [dbo].[V_実験]                                                  │
│AS                                                                          │
│    SELECT [キー],                                                          │
│           [値1],                                                           │
│           [値2]                                                            │
│        FROM [実験DB].[dbo].[T_実験]                                        │
│;                                                                           │
└──────────────────────────────────────┘

【トリガ1】
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[TRIGGER_実験] ON [実験DB].[dbo].[T_実験]              │
│    AFTER UPDATE                                                            │
│AS                                                                          │
│BEGIN                                                                       │
│    BEGIN                                                                   │
│        UPDATE [実験DB].[dbo].[T_実験]                                      │
│            SET [値2] = inserted.[値1]                                      │
│            FROM inserted                                                   │
│            WHERE [T_実験].[キー] = inserted.[キー]                         │
│    END;                                                                    │
│END;                                                                        │
└──────────────────────────────────────┘
  直にinsertedを見るパターン。
  「値1」の値を変更すると「値2」に反映される。(想定通り)

【トリガ2】
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[TRIGGER_実験] ON [実験DB].[dbo].[T_実験]              │
│    AFTER UPDATE                                                            │
│AS                                                                          │
│BEGIN                                                                       │
│    BEGIN                                                                   │
│        UPDATE [実験DB].[dbo].[T_実験]                                      │
│            SET [値2] = [新].[値1]                                          │
│            FROM inserted                                                   │
│                INNER JOIN [実験DB].[dbo].[T_実験] AS [新]                  │
│                  ON [新].[キー] = inserted.[キー]                          │
│    END;                                                                    │
│END;                                                                        │
└──────────────────────────────────────┘
  表を参照するパターン。
  「値1」の値を変更すると「値2」に反映される。(これも想定通り)

【トリガ3】
-- DROP TRIGGER [dbo].[TRIGGER_実験];
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[TRIGGER_実験] ON [実験DB].[dbo].[T_実験]              │
│    AFTER UPDATE                                                            │
│AS                                                                          │
│BEGIN                                                                       │
│    BEGIN                                                                   │
│        UPDATE [実験DB].[dbo].[T_実験]                                      │
│            SET [値2] = [新].[値1]                                          │
│            FROM inserted                                                   │
│                INNER JOIN [実験DB].[dbo].[V_実験] AS [新]                  │
│                  ON [新].[キー] = inserted.[キー]                          │
│    END;                                                                    │
│END;                                                                        │
└──────────────────────────────────────┘
  仮想表を介して表を参照するパターン。
  「値1」の値を変更すると「値2」に反映される。(これも想定通り)

もし、「値1」が昔の値のままなら、「値2」も昔の値に更新される
…が、そうはならないことを確認。
分類:MSSQL