inserted
は疑似テーブルであり、UPDATE
ステートメントの影響を受けたすべての正しい行が確実に含まれています(主キーの場合、テーブルがどのような名前であるかを判断するのは難しいですが、DISTINCT
必要ないと思います)。それらすべてが実際に値を変更したかどうかは、変更された日付/時刻を適用する前に検証することを検討できるもう1つのことです。それを除けば、私はおそらくこのようにするでしょう:ID
121s
ALTER TRIGGER [dbo].[trg_121s]
ON [dbo].[121s]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE t SET modified = CURRENT_TIMESTAMP
FROM dbo.[121s] AS t
WHERE EXISTS (SELECT 1 FROM inserted WHERE ID = t.ID);
-- WHERE EXISTS is same as INNER JOIN inserted AS i ON t.ID = i.ID;
END
GO
すべてが同じタイムスタンプで更新されることを100%確実に保証したい場合(このユースケースで複数の値を見たことがあるかどうかはわかりませんが):
ALTER TRIGGER [dbo].[trg_121s]
ON [dbo].[121s]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ts DATETIME;
SET @ts = CURRENT_TIMESTAMP;
UPDATE t SET modified = @ts
FROM dbo.[121s] AS t
INNER JOIN inserted AS i
ON t.ID = i.ID;
END
GO
また、たとえば列のfoo
値が変更された場合にのみ更新が行われるようにする場合は、次のように言うことができます。
UPDATE t SET modified = @ts
FROM dbo.[121s] AS t
INNER JOIN inserted AS i
ON t.ID = i.ID
AND t.foo <> i.foo;
foo
これは一般的なパターンですが、null許容の場合は、SQL Serverが一方の側に値があり、もう一方の側に値がない(または両方がない)行で一致できないため、より複雑になります。その場合、これを行います。
AND
(
t.foo <> i.foo
OR (t.foo IS NULL AND i.foo IS NOT NULL)
OR (t.foo IS NOT NULL AND i.foo IS NULL)
);
一部の人々は、次のように「魔法の値に対してCOALESCEまたはISNULLを使用できます」と言うでしょう。
WHERE COALESCE(t.foo, 'magic') <> COALESCE(i.foo, 'magic')
...そして、これに対して警告します。データに存在できない魔法の値を常に検索しているからです。