Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

अद्यतन होने के बाद SQL सर्वर में एक पंक्ति को ट्रिगर और अद्यतन करें

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')

...और मैं आपको इसके खिलाफ चेतावनी दूंगा, क्योंकि आप लगातार कुछ जादुई मूल्य खोज रहे होंगे जो डेटा में मौजूद नहीं हो सकते।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दूरस्थ SQL सर्वर पर BCP का उपयोग करके कैसे लिखें?

  2. SQL सर्वर डेटाबेस सर्वर हार्डवेयर अपग्रेड केस स्टडी

  3. SQL सर्वर (T-SQL) में किसी प्रोफ़ाइल के भीतर डेटाबेस मेल खाते की अनुक्रम संख्या कैसे बदलें

  4. MS SQL सर्वर में डेटाबेस मेल सूचनाओं को कॉन्फ़िगर करना

  5. SQL सर्वर 2008:मैं उपयोगकर्ता नाम को विशेषाधिकार कैसे प्रदान करूं?