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

SQL सर्वर में "अंतिम संशोधित" कॉलम बनाएं

कुछ डेटाबेस तालिकाओं में एक "अंतिम संशोधित" कॉलम शामिल होता है, जो उस दिनांक और समय को संग्रहीत करता है जब पंक्ति को अंतिम बार अपडेट किया गया था। हर बार पंक्ति को अपडेट किया जाता है, उस अपडेट की तारीख और समय को दर्शाने के लिए तारीख को अपडेट किया जाता है।

SQL सर्वर में, आप इस अद्यतन को करने के लिए ट्रिगर का उपयोग कर सकते हैं।

ट्रिगर एक विशेष प्रकार की संग्रहीत प्रक्रिया है जो डेटाबेस सर्वर में कोई घटना होने पर स्वचालित रूप से चलती है।

आप CREATE TRIGGER . का उपयोग कर सकते हैं टी-एसक्यूएल का उपयोग करते समय ट्रिगर बनाने के लिए कथन। इस कथन का उपयोग DML, DDL, या लॉगऑन ट्रिगर बनाने के लिए किया जा सकता है।

उदाहरण

निम्न कोड एक तालिका बनाता है, साथ ही एक ट्रिगर जो ModifiedDate . को अपडेट करता है कॉलम जब भी कोई अपडेट हो।

CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);

CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);

पंक्ति सम्मिलित करें

आइए एक पंक्ति डालें और DEFAULT . का परिणाम देखने के लिए इसे चुनें बाधा:

INSERT INTO Books (BookName) 
VALUES ('Trigger Happy');

SELECT * FROM Books;

परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Happy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-17 23:33:15.230

इसे पढ़ने में आसान बनाने के लिए लंबवत आउटपुट का उपयोग करके प्रदर्शित किया जाता है (ताकि आपको सभी कॉलम पढ़ने के लिए किनारे पर स्क्रॉल न करना पड़े)।

इस मामले में, दोनों CreatedDate और ModifiedDate कॉलम में समान मान होते हैं। हालाँकि, यदि पंक्ति को अद्यतन किया जाता है, तो ModifiedDate का मूल्य बदलना चाहिए। इसलिए हमने ट्रिगर बनाया है।

पंक्ति अपडेट करें

अब पंक्ति को अपडेट करते हैं और परिणाम चुनते हैं।

UPDATE Books 
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;

SELECT * FROM Books;

परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Hippy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-18 00:07:39.680

जैसा अपेक्षित था, ModifiedDate कॉलम अपडेट किया गया है लेकिन CreateDate कॉलम वही रहता है।

संहिता की और व्याख्या

तालिका और उससे संबद्ध ट्रिगर बनाने के लिए उपयोग किए गए कोड का अधिक विस्तृत विवरण नीचे दिया गया है।

तालिका

निम्न कोड तालिका बनाता है:

CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);

ModifiedDate कॉलम में एक DEFAULT है बाधा जो डिफ़ॉल्ट मान को CURRENT_TIMESTAMP . पर सेट करती है (जैसा कि CreateDate . करता है कॉलम)।

इसका मतलब है कि जब पहली बार पंक्ति डाली जाती है, तो CURRENT_TIMESTAMP उन कॉलम में डाला जाता है।

यह प्रारंभिक डालने के लिए ठीक है, लेकिन यह बाद के किसी भी अपडेट को पूरा नहीं करता है। यहीं से ट्रिगर आता है।

द ट्रिगर

निम्नलिखित कोड ट्रिगर बनाता है:

CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);

इस मामले में, मैंने ट्रिगर को कॉल किया trg_Books_UpdateModifiedDate

मैंने इसे dbo.Books . पर बनाया है डेटाबेस, और यह हर UPDATE . के बाद चलता है ।

जब यह चलता है, तो यह ModifiedDate . को अपडेट करता है CURRENT_TIMESTAMP . पर कॉलम (लेकिन केवल उस पंक्ति पर जो निश्चित रूप से अपडेट की गई थी)।

मैं inserted . की जांच करके यह निर्धारित करने में सक्षम हूं कि कौन सी पंक्ति अपडेट की गई थी टेबल। inserted तालिका एक अस्थायी, स्मृति-निवासी तालिका है जिसे SQL सर्वर बनाता है और बनाए रखता है।

inserted तालिका INSERT . के दौरान प्रभावित पंक्तियों की प्रतियां संग्रहीत करती है और UPDATE बयान। इंसर्ट या अपडेट ट्रांजैक्शन के दौरान, inserted . दोनों में नई पंक्तियां जोड़ी जाती हैं तालिका और ट्रिगर तालिका। inserted में पंक्तियाँ तालिका ट्रिगर तालिका में नई पंक्तियों की प्रतियां हैं।

inserted . के अलावा तालिका, SQL सर्वर एक deleted . को भी बनाता और रखता है टेबल। एक अपडेट ट्रांजैक्शन एक डिलीट ऑपरेशन के समान है जिसके बाद एक इंसर्ट ऑपरेशन होता है; पुरानी पंक्तियों को deleted . में कॉपी किया जाता है तालिका पहले, और फिर नई पंक्तियों को ट्रिगर तालिका में कॉपी किया जाता है और inserted टेबल।

“बनाई गई तिथि” कॉलम के लिए एक ट्रिगर

DEFAULT का उपयोग करना प्रारंभिक मूल्य बनाने के लिए बाधा एक आसान तरीका है, लेकिन आप जोखिम उठाते हैं कि कोई व्यक्ति बाद में उस मूल्य को सीधे अपडेट कर सकता है।

यदि आप इसे एक समस्या के रूप में देखते हैं, तो आप "बनाई गई तिथि" कॉलम को शामिल करने के लिए ट्रिगर को संशोधित कर सकते हैं, ताकि जब भी पंक्ति में कोई अपडेट हो, तो वह इसे अपने मूल मान पर रीसेट कर सके।

आप deleted . से मूल मान प्राप्त कर सकते हैं तालिका, यह देखते हुए कि कोई भी अद्यतन होने से पहले पुरानी पंक्तियों को पहले इस तालिका में कॉपी किया जाता है।


  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 सर्वर में स्ट्रिंग्स को जोड़ने के लिए GROUP BY का उपयोग कैसे करें?

  2. SQL सर्वर प्रबंधन स्टूडियो (SSMS) में वस्तुओं को कैसे फ़िल्टर करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 19

  3. @@ पहचान, SCOPE_IDENTITY (), OUTPUT और अंतिम पहचान प्राप्त करने के अन्य तरीके

  4. टी-एसक्यूएल एक्सओआर ऑपरेटर

  5. SQL सर्वर गतिरोध क्या है?