inserted
एक छद्म तालिका है और इसमें निश्चित रूप से सभी सही पंक्तियाँ शामिल हैं जो UPDATE
. से प्रभावित थीं कथन (और मुझे लगता है DISTINCT
जरूरी नहीं है, अगर 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
अशक्त है, क्योंकि SQL सर्वर उन पंक्तियों से मेल नहीं खा पाएगा जहाँ एक पक्ष का मान है और दूसरा नहीं (या दोनों नहीं)। उस स्थिति में आप यह करेंगे:
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')
...और मैं आपको इसके खिलाफ चेतावनी दूंगा, क्योंकि आप लगातार कुछ जादुई मूल्य खोज रहे होंगे जो डेटा में मौजूद नहीं हो सकते।