inserted
adalah tabel semu dan pasti berisi semua baris kanan yang terpengaruh oleh UPDATE
pernyataan (dan saya berasumsi DISTINCT
tidak perlu, jika ID
kunci utama - meskipun sulit untuk mengetahui apa tabel dengan nama seperti 121s
). Apakah semuanya benar-benar berubah values adalah hal lain yang mungkin Anda pertimbangkan untuk divalidasi sebelum menerapkan tanggal/waktu yang dimodifikasi. Kecuali itu, saya mungkin akan melakukannya dengan cara ini:
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
Jika Anda ingin mendapatkan jaminan 100% sangat mudah bahwa semuanya diperbarui dengan stempel waktu yang sama (walaupun saya tidak tahu apakah saya pernah melihat banyak nilai dalam kasus penggunaan ini):
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
Dan jika Anda ingin memastikan bahwa pembaruan hanya terjadi jika, katakanlah, kolom foo
diubah nilainya, bisa dibilang:
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;
Itu pola umumnya, tetapi menjadi lebih rumit jika foo
tidak dapat dibatalkan, karena SQL Server tidak akan dapat mencocokkan pada baris di mana satu sisi memiliki nilai dan sisi lainnya tidak (atau keduanya tidak). Dalam hal ini Anda akan melakukan ini:
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)
);
Beberapa orang akan mengatakan "Saya hanya bisa menggunakan COALESCE atau ISNULL terhadap beberapa nilai ajaib" seperti ini:
WHERE COALESCE(t.foo, 'magic') <> COALESCE(i.foo, 'magic')
...dan saya akan memperingatkan Anda tentang hal ini, karena Anda akan terus-menerus mencari nilai ajaib yang tidak ada dalam data.