जब आप SQL सर्वर में एक ट्रिगर बनाते हैं, तो आपके पास इसे ट्रिगर करने वाले कथन (यानी ट्रिगर को सक्रिय करने वाला SQL कथन) के संयोजन के साथ सक्रिय करने का विकल्प होता है, या इसे बजाय सक्रिय करने का विकल्प होता है। उस कथन का।
ट्रिगर को सक्रिय करने के लिए बजाय ट्रिगरिंग स्टेटमेंट में, INSTEAD OF
का उपयोग करें तर्क।
यह FOR
. का उपयोग करने के विपरीत है या AFTER
तर्क। जब आप उन तर्कों का उपयोग करते हैं, तो ट्रिगर केवल तभी सक्रिय होता है जब ट्रिगरिंग SQL कथन में निर्दिष्ट सभी ऑपरेशन सफलतापूर्वक लॉन्च हो गए हों।
उदाहरण
एक नमूना तालिका बनाएं:
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0
);
ट्रिगर बनाएं:
CREATE TRIGGER trg_t1
ON t1
INSTEAD OF UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);
एक नमूना पंक्ति डालें:
INSERT INTO t1 (c1, c2, c3)
VALUES (1, 1, 1);
SELECT * FROM t1;
यहाँ हमारे पास अब तक क्या है:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 1 | +------+------+------+------+
अब एक UPDATE
चलाते हैं तालिका के विरुद्ध कथन (इससे ट्रिगर सक्रिय हो जाएगा).
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
परिणाम:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 2 | +------+------+------+------+
जैसा अपेक्षित था, UPDATE
ट्रिगरिंग स्टेटमेंट में स्टेटमेंट को ट्रिगर में से एक के साथ बदल दिया गया था।
मेरे ट्रिगर ने निर्दिष्ट किया है कि जब भी तालिका में अपडेट करने का प्रयास किया जाता है, तो c3
. को अपडेट करें इसके बजाय कॉलम।
केवल तभी चलाएं जब कोई विशिष्ट कॉलम अपडेट हो
आप UPDATE()
. का भी उपयोग कर सकते हैं एक निर्दिष्ट कॉलम के अपडेट होने पर ही चलने के लिए कोड निर्दिष्ट करने के लिए कार्य करता है।
उदाहरण के लिए, हम अपने ट्रिगर को इस प्रकार बदल सकते हैं:
ALTER TRIGGER trg_t1
ON t1
INSTEAD OF UPDATE
AS
IF ( UPDATE(c1) )
BEGIN
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
अब पिछला UPDATE
चलाएं फिर से बयान:
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
परिणाम:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 3 | +------+------+------+------+
फिर से, c3
कॉलम बढ़ा हुआ है।
लेकिन, अब c2
. को अपडेट करने का प्रयास करते हैं कॉलम:
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
परिणाम:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 3 | +------+------+------+------+
कुछ नहीं बदलता है। c3
कॉलम वही रहता है।
यहां तक कि c2
भी नहीं कॉलम अपडेट किया गया है। ऐसा इसलिए है, क्योंकि ट्रिगरिंग स्टेटमेंट के बजाय ट्रिगर अभी भी चलता है।
DELETE के बजाय ट्रिगर चलाएँ
हम किसी भी DELETE
. के बजाय चलाने के लिए ट्रिगर को संशोधित कर सकते हैं बयान।
ALTER TRIGGER trg_t1
ON t1
INSTEAD OF DELETE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM deleted);
आइए अब सभी पंक्तियों को हटाने का प्रयास करें और फिर तालिका से सभी पंक्तियों का चयन करें।
DELETE FROM t1;
SELECT * FROM t1;
परिणाम:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 1 | 4 | +------+------+------+------+
ध्यान दें कि इस ट्रिगर के ठीक से काम करने के लिए, मुझे deleted
. को क्वेरी करना था मेरे ट्रिगर में तालिका (inserted
. के विपरीत) पिछले उदाहरणों में तालिका)।
इन दो तालिकाओं को SQL सर्वर द्वारा बनाया और प्रबंधित किया जाता है।
deleted
तालिका DELETE
. के दौरान प्रभावित पंक्तियों की प्रतियां संग्रहीत करती है और UPDATE
बयान। DELETE
. के निष्पादन के दौरान या UPDATE
कथन, पंक्तियों को ट्रिगर तालिका से हटा दिया जाता है और हटाए गए तालिका में स्थानांतरित कर दिया जाता है।
inserted
तालिका INSERT
. के दौरान प्रभावित पंक्तियों की प्रतियां संग्रहीत करती है और UPDATE
बयान। एक सम्मिलित या अद्यतन लेनदेन के दौरान, सम्मिलित तालिका और ट्रिगर तालिका दोनों में नई पंक्तियाँ जोड़ी जाती हैं। सम्मिलित तालिका में पंक्तियाँ ट्रिगर तालिका में नई पंक्तियों की प्रतियाँ हैं।
ध्यान में रखने के लिए कुछ प्रतिबंध
आप अधिकतम एक INSTEAD OF
परिभाषित कर सकते हैं ट्रिगर प्रति INSERT
, UPDATE
, या DELETE
एक मेज या दृश्य पर बयान।
आप INSTEAD OF
परिभाषित नहीं कर सकते हैं अद्यतन करने योग्य दृश्यों पर ट्रिगर जो WITH CHECK OPTION
. का उपयोग करते हैं ।