कुछ डेटाबेस तालिकाओं में एक "अंतिम संशोधित" कॉलम शामिल होता है, जो उस दिनांक और समय को संग्रहीत करता है जब पंक्ति को अंतिम बार अपडेट किया गया था। हर बार पंक्ति को अपडेट किया जाता है, उस अपडेट की तारीख और समय को दर्शाने के लिए तारीख को अपडेट किया जाता है।
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
. से मूल मान प्राप्त कर सकते हैं तालिका, यह देखते हुए कि कोई भी अद्यतन होने से पहले पुरानी पंक्तियों को पहले इस तालिका में कॉपी किया जाता है।