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

SQL सर्वर में "इसके बजाय" ट्रिगर बनाएं

जब आप 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 . का उपयोग करते हैं ।


  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 सर्वर 2016:एक संग्रहीत कार्यविधि बनाएँ

  2. एसक्यूएल में शून्य त्रुटि से विभाजन से कैसे बचें?

  3. T-SQL का उपयोग करके लिंक किए गए सर्वर विकल्पों को कैसे संपादित करें

  4. SQL सर्वर 2005 और अस्थायी टेबल स्कोप

  5. घटक 'तदर्थ वितरित क्वेरी' के "SQL सर्वर ने STATEMENT 'OpenRowset/OpenDatasource' तक पहुंच को अवरुद्ध कर दिया" को ठीक करें