inserted
je pseudotabulka a rozhodně obsahuje všechny správné řádky, které byly ovlivněny UPDATE
prohlášení (a předpokládám, že DISTINCT
není nutné, pokud ID
primární klíč – i když je těžké určit, co je tabulka s názvem jako 121s
). Zda se všechny skutečně změnily hodnoty je další věc, kterou můžete zvážit před použitím upraveného data/času. Kromě toho bych to pravděpodobně udělal takto:
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
Pokud chcete mít 100% spolehlivou záruku, že jsou všechny aktualizovány se stejným časovým razítkem (i když nevím, jestli jsem někdy v tomto případě viděl více hodnot):
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
A pokud chcete zajistit, aby k aktualizaci došlo pouze v případě, řekněme, ve sloupci foo
změněnou hodnotu, dalo by se říci:
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;
To je obecný vzorec, ale stane se složitějším, pokud foo
má hodnotu null, protože SQL Server nebude schopen porovnat řádky, kde jedna strana má hodnotu a druhá ne (nebo obě ne). V takovém případě byste udělali toto:
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)
);
Někteří lidé řeknou:„Prostě mohu použít COALESCE nebo ISNULL proti nějaké magické hodnotě“ takto:
WHERE COALESCE(t.foo, 'magic') <> COALESCE(i.foo, 'magic')
...a před tím vás budu varovat, protože budete neustále hledat nějakou magickou hodnotu, která v datech nemůže existovat.