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

SQL सर्वर ट्रिगर - भाग 2 DDL और लॉगऑन ट्रिगर

SQL सर्वर में, ट्रिगर डेटाबेस ऑब्जेक्ट होते हैं जो डेटाबेस या सर्वर पर ट्रिगरिंग ईवेंट होने पर निष्पादित हो जाएंगे। ट्रिगर व्यावसायिक आवश्यकताओं को प्राप्त करने में महत्वपूर्ण भूमिका निभाते हैं जैसे कि प्राप्त की गई शर्त के आधार पर लक्षित लोगों को सचेत करना, नौकरी शुरू करना, या अन्य संचालन। डीएमएल ट्रिगर्स पर पिछले लेख में, हमने ट्रिगर्स, ट्रिगर्स के प्रकार और डीएमएल ट्रिगर्स के लिए उपलब्ध विभिन्न ट्रिगर विकल्पों के बारे में बात की थी। इस लेख में, हम SQL DDL और LOGON ट्रिगर्स को एक्सप्लोर करेंगे।

डीडीएल ट्रिगर

डीडीएल ट्रिगर्स को डीडीएल और डीसीएल कमांड सहित विभिन्न सर्वर या डेटाबेस स्कोप्ड इवेंट्स के लिए सक्रिय किया जा सकता है। DDL का मतलब डेटा डेफिनिशन लैंग्वेज है जिसका इस्तेमाल किसी भी ऑब्जेक्ट को बनाने, बदलने, छोड़ने के लिए किया जाता है और DCL का मतलब डेटा कंट्रोल लैंग्वेज स्टेटमेंट जैसे GRANT, DENY और REVOKE कमांड है। SQL DDL ट्रिगर की विशेषताएं नीचे दी गई हैं।

  1. DDL ट्रिगर को डेटाबेस स्तर या सर्वर इंस्टेंस स्तर पर बनाया जा सकता है जिसमें DDL संचालन या DDL समान संचालन की एक विस्तृत विविधता शामिल है, उदा। डीसीएल कमांड।
  2. डीडीएल ट्रिगर को केवल ट्रिगर के लिए या बाद में ट्रिगर प्रकार के रूप में लागू या सक्रिय किया जा सकता है। SQL सर्वर DDL ट्रिगर के स्थान पर समर्थन नहीं करता है और हम देख सकते हैं कि DDL ट्रिगर के माध्यम से कुछ DDL संचालन को कैसे रोका जाए।
  3. एसक्यूएल सर्वर में EVENTDATA() और IS_MEMBER() जैसे बिल्ट-इन फंक्शन हैं, जिनका उपयोग DDL ट्रिगर के भीतर किया जाता है ताकि ट्रिगर इवेंट से संबंधित अधिक जानकारी प्राप्त की जा सके।
    1. EVENTDATA() फ़ंक्शन डेटाबेस या सर्वर स्कोप्ड इवेंट्स के बारे में एक्सएमएल प्रारूप में डेटाबेस या सर्वर स्कोप्ड डीडीएल ट्रिगर या लॉगऑन ट्रिगर के दायरे के भीतर पूरा विवरण देता है। EVENTDATA () फ़ंक्शन उस सत्र के लिए संपूर्ण ईवेंट विवरण देता है जो DDL या लॉगऑन गतिविधियाँ करता है। EVENTDATA() नीचे दिए गए विवरण देता है
      • इवेंट प्रकार - ईवेंट का प्रकार जो sys.trigger_event_types तालिका में उपलब्ध DDL ट्रिगर को सक्रिय करता है।
      • पोस्टटाइम - वह समय जब ईवेंट ट्रिगर या पोस्ट किया गया था।
      • SPID - घटना की सत्र आईडी।
      • सर्वरनाम - SQL सर्वर इंस्टेंस नाम जिसमें ईवेंट ट्रिगर किया गया था।
      • LoginName - SQL सर्वर लॉगिन नाम जिसने इवेंट को अंजाम दिया।
      • उपयोगकर्ता नाम - लॉगिन का उपयोगकर्ता नाम जो डिफ़ॉल्ट रूप से dbo होगा।
      • डेटाबेसनाम - डेटाबेस नाम जिसके तहत डीडीएल ट्रिगर को सक्रिय किया गया था।
      • SchemaName - स्कीमा उस वस्तु का नाम जो प्रभावित हुई थी।
      • वस्तु का नाम - वस्तु का नाम जो प्रभावित हुआ था।
      • ऑब्जेक्ट टाइप - SQL सर्वर ऑब्जेक्ट का प्रकार जैसे टेबल, व्यू, संग्रहित प्रक्रिया।
      • TSQLCommand - T-SQL स्क्रिप्ट जिसे उस उपयोगकर्ता द्वारा निष्पादित किया गया था जिसने DDL ट्रिगर को लागू किया था।
      • सेटऑप्शन - TSQLCommand के निष्पादित होने के दौरान उपयोगकर्ता या क्लाइंट जैसे SSMS द्वारा उपयोग किए जाने वाले SET विकल्प।
      • CommandText - sys.trigger_event_types तालिका में निर्दिष्ट DDL ईवेंट के साथ वास्तविक DDL या DCL विवरण।
    2. IS_MEMBER() फ़ंक्शन देता है कि वर्तमान उपयोगकर्ता Windows समूह का सदस्य है या SQL सर्वर डेटाबेस भूमिका का सदस्य है या नहीं।
  4. सिस्टम DMV sys.triggers सभी डेटाबेस स्कोप्ड ट्रिगर्स की सूची संग्रहीत करता है। हम सभी डेटाबेस स्कोप्ड डीडीएल ट्रिगर्स का विवरण प्राप्त करने के लिए नीचे दी गई क्वेरी का उपयोग कर सकते हैं।
SELECT * 
FROM sys.triggers
WHERE type = 'TR';
  1. सिस्टम DMV sys.server_triggers सभी सर्वर स्कोप्ड ट्रिगर्स की सूची को स्टोर करता है और हम सभी सर्वर स्कोप्ड DDL ट्रिगर्स के बारे में विवरण प्राप्त करने के लिए नीचे दी गई क्वेरी का उपयोग कर सकते हैं।
SELECT * 
FROM sys.server_triggers;
  1. डीडीएल ट्रिगर परिभाषाओं को देखा जा सकता है यदि ट्रिगर को sys.sql_modules से नीचे दिए गए किसी भी विकल्प का उपयोग करके या OBJECT_DEFINITION() फ़ंक्शन का उपयोग करके या sp_helptext संग्रहीत कार्यविधि का उपयोग करके एन्क्रिप्ट नहीं किया गया है।
SELECT OBJECT_SCHEMA_NAME(object_id, db_id()) Schema_name, OBJECT_NAME(object_id) Trigger_Name, definition
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID(<trigger_name>);   

SELECT OBJECT_DEFINITION (OBJECT_ID(<trigger_name>)) AS ObjectDefinition; 

EXEC sp_helptext '<trigger_name>';
  1. सभी संभावित DDL ईवेंट sys.trigger_event_types तालिका में उपलब्ध हैं और नीचे दी गई क्वेरी का उपयोग करके देखे जा सकते हैं।
SELECT *
FROM sys.trigger_event_types;

DDL ट्रिगर का सिंटैक्स है:

CREATE TRIGGER <trigger_name>
ON < ALL SERVER | DATABASE > 
[ WITH <DDL_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } <event_type>
AS { sql_statement | EXTERNAL NAME <method specifier> }  

डेटाबेस स्कोप्ड DDL ट्रिगर बनाना

आइए सभी टेबल क्रिएशन को ट्रैक करने के लिए एक डेटाबेस स्कोप्ड ट्रिगर बनाएं और नीचे दी गई स्क्रिप्ट का उपयोग करके Track_DDL_Changes नाम की एक लॉगिंग टेबल में लॉग इन करें।

CREATE TABLE Track_DDL_Changes (EventData xml, PostDtm datetime)
GO
CREATE TRIGGER TR_D_CREATETABLE
ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
	INSERT INTO Track_DDL_Changes
	SELECT EVENTDATA(),GETDATE()
END
GO

आइए ट्रिगर_टेस्ट नामक एक नई तालिका बनाएं और सत्यापित करें कि तालिका बनाएं ईवेंट का ऑडिट किया गया था या नहीं, नीचे दी गई स्क्रिप्ट का उपयोग करके।

CREATE TABLE Trigger_Test ( a int, b datetime);

Track_DDL_Changes तालिका से डेटा का चयन दिखाता है कि उपरोक्त CREATE_TABLE ईवेंट सफलतापूर्वक कैप्चर किया गया था जैसा कि नीचे दिखाया गया है:

EventData मान पर क्लिक करने से XML EVENTDATA () मान एक नई विंडो में खुल जाएगा जैसा कि नीचे दिखाया गया है।

हम EVENTDATA() फ़ंक्शन के माध्यम से ट्रिगरिंग ईवेंट के बारे में पूर्ण विवरण सत्यापित करने में सक्षम हैं और इसलिए EVENTDATA() फ़ंक्शन किसी भी DDL या LOGON ट्रिगर के लिए महत्वपूर्ण भूमिका निभाएगा।

हम EVENTDATA () फ़ंक्शन और XML पार्सिंग की मदद से अपने DDL ट्रिगर को और बढ़ा सकते हैं और नीचे दी गई स्क्रिप्ट का उपयोग करके किसी को भी टेस्ट डेटाबेस में कोई भी टेबल बनाने से रोक सकते हैं:

CREATE TRIGGER TR_D_PREVENT_CREATETABLE
ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
   SELECT EVENTDATA().value  
        ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
   RAISERROR ('Creation of New tables restricted in this database, Kindly contact DBA.', 16, 1)   
   ROLLBACK  
END
GO

डेटाबेस स्कोप्ड ट्रिगर का निर्माण सफलतापूर्वक पूरा हुआ और आइए नीचे दी गई स्क्रिप्ट का उपयोग करके एक और तालिका बनाकर सत्यापित करें।

CREATE TABLE Trigger_Test1 (a int, b datetime);

ट्रिगर ने हमें इस डेटाबेस पर नई तालिकाएँ बनाने से रोका है और उपयोगकर्ताओं के लिए एक सार्थक संदेश भी छोड़ा है। आवश्यकताओं को पूरा करने के लिए हम इसी तरह किसी अन्य डीडीएल या सर्वर स्कोप्ड इवेंट को संभाल सकते हैं।

डेटाबेस स्कोप्ड डीडीएल ट्रिगर को छोड़ने के लिए, हमें नीचे दिए गए सिंटैक्स का उपयोग करने की आवश्यकता है:

DROP TRIGGER <trigger_name> ON DATABASE;

और जो ट्रिगर हमने अभी बनाया है उसे छोड़ने के लिए, स्क्रिप्ट होगी

DROP TRIGGER TR_D_PREVENT_CREATETABLE ON DATABASE;

एसएसएमएस में डेटाबेस स्कोप्ड डीडीएल ट्रिगर्स देखने के लिए, टेस्ट डेटाबेस का विस्तार करें -> प्रोग्रामेबिलिटी -> डेटाबेस ट्रिगर्स जैसा कि नीचे दिखाया गया है।

SQL DML ट्रिगर के समान, DDL ट्रिगर को नीचे दिखाए गए अनुसार ट्रिगर नाम पर राइट-क्लिक करके गिरा, अक्षम या सक्षम किया जा सकता है।

टी-एसक्यूएल के माध्यम से, हम नीचे दिए गए सिंटैक्स का उपयोग करके डेटाबेस स्कोप्ड डीडीएल ट्रिगर को छोड़ या अक्षम या सक्षम कर सकते हैं:

-- DROP Database scoped DDL Trigger
DROP TRIGGER <trigger_name> ON DATABASE;
-- Enable Database scoped DDL Trigger
ENABLE TRIGGER <trigger_name> ON DATABASE;
-- Disable Database scoped DDL Trigger
DISABLE TRIGGER <trigger_name> ON DATABASE;

हमारे द्वारा बनाए गए ट्रिगर को अक्षम करने के लिए, हमें नीचे दी गई स्क्रिप्ट का उपयोग करने की आवश्यकता हो सकती है।

-- DROP Database scoped DDL Trigger
DROP TRIGGER TR_D_PREVENT_CREATETABLE ON DATABASE;
-- Enable Database scoped DDL Trigger
ENABLE TRIGGER TR_D_PREVENT_CREATETABLE ON DATABASE;
-- Disable Database scoped DDL Trigger
DISABLE TRIGGER TR_D_PREVENT_CREATETABLE ON DATABASE;

सर्वर स्कोप्ड DDL ट्रिगर बनाना

सर्वर स्कोप्ड DDL ट्रिगर डेटाबेस स्कोप DDL ट्रिगर के समान सिंटैक्स का अनुसरण करता है, सिवाय इसके कि ईवेंट सर्वर स्कोप पर आधारित होंगे।

आइए नीचे दी गई स्क्रिप्ट का उपयोग करके किसी भी उपयोगकर्ता को इस सर्वर इंस्टेंस पर एक नया डेटाबेस बनाने से रोकने के लिए सर्वर स्कोप्ड डीडीएल ट्रिगर बनाने का प्रयास करें।

CREATE TRIGGER TR_S_PREVENT_CREATEDATABASE
ON ALL SERVER
FOR CREATE_DATABASE
AS
BEGIN
   SELECT EVENTDATA().value  
        ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
   RAISERROR ('Creation of New Databases restricted in this Instance, Kindly contact DBA.', 16, 1)   
   ROLLBACK  
END
GO

नीचे दिए गए कमांड का उपयोग करके एक नया डेटाबेस बनाने का प्रयास करते समय, हमें एक त्रुटि प्राप्त होगी जैसा कि नीचे दिखाया गया है।

CREATE DATABASE DATABASE_TEST;

SSMS में, सर्वर ने नीचे दिखाए गए अनुसार सर्वर ऑब्जेक्ट सेक्शन में ट्रिगर के अंतर्गत DDL ट्रिगर्स को स्कोप किया।

जैसा कि नीचे दिखाया गया है, हम सर्वर स्कोप्ड डीडीएल ट्रिगर को केवल राइट-क्लिक करके सर्वर स्कोप्ड डीडीएल ट्रिगर को ड्रॉप, अक्षम या सक्षम कर सकते हैं।

टी-एसक्यूएल के माध्यम से, हम नीचे दिए गए कमांड का उपयोग करके ड्रॉप या डिसेबल या इनेबल कर सकते हैं।

-- DROP Server scoped DDL Trigger
DROP TRIGGER TR_S_PREVENT_CREATEDATABASE ON ALL SERVER;
-- Disable Server scoped DDL Trigger
DISABLE TRIGGER TR_S_PREVENT_CREATEDATABASE ON ALL SERVER;
-- Enable Server scoped DDL Trigger
ENABLE TRIGGER TR_S_PREVENT_CREATEDATABASE ON ALL SERVER;

डीडीएल ट्रिगर का उद्देश्य

  1. डेटाबेस या सर्वर स्तर पर होने वाले किसी भी डीडीएल ईवेंट का ऑडिट करने के लिए।
  2. डेटाबेस या सर्वर स्तर पर होने वाली किसी भी डीडीएल घटनाओं को रोकने के लिए।
  3. डेटाबेस या सर्वर स्तर पर होने वाली किसी भी डीडीएल घटनाओं को सतर्क करने के लिए।

लॉगऑन ट्रिगर

लॉगऑन ट्रिगर, जैसा कि नाम से संकेत मिलता है, SQL सर्वर में लॉगऑन इवेंट के लिए निष्पादित किया जाता है। एक बार लॉगिन इवेंट के लिए प्रमाणीकरण चरण पूरा हो जाने पर, लॉग इन गतिविधि के अलावा लॉगऑन ट्रिगर स्क्रिप्ट को निष्पादित किया जाएगा। यदि लॉगिन सफलतापूर्वक प्रमाणित नहीं होता है, तो LOGON ट्रिगर सक्रिय नहीं होंगे। लॉगऑन ट्रिगर्स को सर्वर ऑब्जेक्ट्स के ट्रिगर्स सेक्शन के तहत SSMS में सूचीबद्ध किया जाएगा। लॉगऑन ट्रिगर का सिंटैक्स इस प्रकार है:

CREATE TRIGGER <schema_name.trigger_name>
ON ALL SERVER
{ FOR| AFTER } LOGON    
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  

ट्रिगर बनाएं

आइए नीचे दिखाए गए अनुसार EVENTDATA() फ़ंक्शन से लॉगऑन ईवेंट के बारे में अधिक जानकारी प्राप्त करने के लिए एक सरल लॉगऑन ट्रिगर बनाएं।

CREATE TABLE Track_LOGON_EVENTS (EventData xml, PostDtm datetime)
GO
CREATE TRIGGER TR_LOGON
ON ALL SERVER
FOR LOGON
AS
BEGIN
	INSERT INTO Track_LOGON_EVENTS
	SELECT EVENTDATA(),GETDATE();
END
GO

उपरोक्त लॉगऑन ट्रिगर एक लॉगिन गतिविधि के बारे में सभी विवरणों को कैप्चर करेगा, जैसा कि हमने डीडीएल ट्रिगर में EVENTDATA () फ़ंक्शन का उपयोग करते समय देखा है। लॉगऑन ट्रिगर का उपयोग करने की योजना बनाते समय हमें सावधान रहना चाहिए जैसे कि ट्रिगर के अंदर कोई तर्क त्रुटियाँ हैं, यह किसी को या अधिकांश उपयोगकर्ताओं को SQL सर्वर के इंस्टेंस से कनेक्ट करने की अनुमति नहीं देगा।

लॉगऑन ट्रिगर्स को ड्रॉप, अक्षम या सक्षम करने के लिए, हम नीचे दी गई स्क्रिप्ट का उपयोग कर सकते हैं।

-- DROP LOGON Trigger
DROP TRIGGER TR_LOGON ON ALL SERVER;
-- Disable LOGON Trigger
DISABLE TRIGGER TR_LOGON ON ALL SERVER;
-- Enable LOGON Trigger
ENABLE TRIGGER TR_LOGON ON ALL SERVER;

लॉगऑन ट्रिगर का उद्देश्य

  1. सर्वर पर होने वाले किसी भी लॉगऑन ईवेंट का ऑडिट करने के लिए।
  2. सर्वर पर होने वाली किसी भी लॉगऑन घटनाओं को रोकने के लिए
  3. सर्वर पर जब भी कोई लॉगऑन इवेंट हो रहा हो तो अलर्ट करने के लिए।

ट्रिगर गुण

sp_settriggerorder

sp_settriggerorder का उपयोग केवल पहले और अंतिम ट्रिगर के लिए ट्रिगर निष्पादन के क्रम को परिभाषित करने के लिए किया जाता है। यदि किसी तालिका में 2 से अधिक DML ट्रिगर हैं, मान लें कि 5 DML ट्रिगर हैं, तो हम पहले DML ट्रिगर और अंतिम DML ट्रिगर को परिभाषित कर सकते हैं, लेकिन बीच के 3 ट्रिगर के क्रम को परिभाषित नहीं कर सकते।

नोट: DML ट्रिगर के लिए किसी विशेष ईवेंट श्रेणी के लिए FIRST या LAST विकल्प सेट करना विशिष्ट है। उदाहरण के लिए 3 INSERT ट्रिगर वाली तालिका में, हम परिभाषित कर सकते हैं कि कौन सा INSERT ट्रिगर पहला है और कौन सा INSERT ट्रिगर अंतिम है। यदि आपके पास टेबल पर 3 ट्रिगर हैं जैसे INSERT, UPDATE, और DELETE वाले, तो ट्रिगर ऑर्डर कंडीशन सेट करने की कोई आवश्यकता नहीं है।

ट्रिगर ऑर्डर सेट करने का सिंटैक्स इस प्रकार होगा:

exec sp_settriggerorder @triggername = '<trigger_schema_name.trigger_name>' 
    , @order = 'FIRST' | 'LAST'   
    , @stmttype = '<trigger event type>'   
    , @namespace = 'DATABASE' | 'SERVER' | 'NULL'

डीडीएल ट्रिगर्स के लिए, हम पहले और आखिरी सर्वर स्कोप्ड ट्रिगर्स को परिभाषित कर सकते हैं और फिर पहले और आखिरी डेटाबेस स्कोप्ड ट्रिगर्स को परिभाषित कर सकते हैं। उदाहरण के लिए, यदि हमारे पास 5 सर्वर स्कोप्ड ट्रिगर और 5 डेटाबेस स्कोप्ड ट्रिगर हैं, तो ऑर्डर को इस तरह परिभाषित किया जा सकता है:

  1. सर्वर स्कोप्ड डीडीएल ट्रिगर के लिए पहला ट्रिगर
  2. 3 अन्य सर्वर स्कोप्ड डीडीएल यादृच्छिक क्रम में ट्रिगर करता है
  3. सर्वर स्कोप्ड डीडीएल ट्रिगर के लिए अंतिम ट्रिगर।
  4. डेटाबेस स्कोप्ड डीडीएल ट्रिगर के लिए पहला ट्रिगर (प्रति डेटाबेस एक)
  5. 3 अन्य डेटाबेस स्कोप्ड डीडीएल यादृच्छिक क्रम में ट्रिगर करता है
  6. डेटाबेस स्कोप्ड डीडीएल ट्रिगर के लिए अंतिम ट्रिगर।

पहले या अंतिम विकल्प को सेट करने के संबंध में, डेटाबेस के दायरे में डीडीएल ट्रिगर्स को डेटाबेस के भीतर और सर्वर स्कोप्ड डीडीएल ट्रिगर्स को इंस्टेंस स्तर पर ऑर्डर किया जा सकता है।

भले ही SQL सर्वर हमें एक टेबल पर बहुत सारे ट्रिगर बनाने की अनुमति देता है, बेहतर रखरखाव और समस्या निवारण के लिए ट्रिगर की आवश्यकताओं का सावधानीपूर्वक विश्लेषण करने की अनुशंसा की जाती है।

पुनरावर्ती ट्रिगर

SQL सर्वर DML ट्रिगर्स के लिए पुनरावर्ती ट्रिगर्स को इनवोकिंग करने का भी समर्थन करता है। रिकर्सिव ट्रिगर्स को नीचे दिखाए गए अनुसार प्रत्यक्ष या अप्रत्यक्ष रूप से वर्गीकृत किया जा सकता है।

प्रत्यक्ष पुनरावर्ती ट्रिगर - उपयोगकर्ता या एप्लिकेशन तालिका ए में एक रिकॉर्ड अपडेट करता है। तालिका ए में अद्यतन ट्रिगर ए सक्रिय हो जाता है और तालिका ए को फिर से अपडेट करता है। चूंकि तालिका A में रिकॉर्ड ट्रिगर के माध्यम से अपडेट किया गया था, यह फिर से UPDATE ट्रिगर A को लागू करेगा और यह पुनरावर्ती रूप से होगा।

आइए नीचे दी गई स्क्रिप्ट का उपयोग करके बिक्री तालिका पर एक प्रत्यक्ष पुनरावर्ती ट्रिगर बनाएं:

CREATE TRIGGER TR_UPD_Recursive_Sales ON Sales
FOR UPDATE 
AS
BEGIN
  UPDATE Sales 
  SET SalesDate = GETDATE() 
  WHERE SalesId = (SELECT SalesId FROM Inserted)
END
GO

नीचे दी गई स्क्रिप्ट निष्पादित करें:

UPDATE Sales 
SET SalesDate = GETDATE() 
WHERE SalesId = 3;

अप्रत्यक्ष पुनरावर्ती ट्रिगर - उपयोगकर्ता या एप्लिकेशन तालिका ए में एक रिकॉर्ड अपडेट करता है। तालिका ए में अद्यतन ट्रिगर ए निकाल दिया जाता है और तालिका बी में एक रिकॉर्ड अपडेट करता है। यदि तालिका बी में तालिका ए में रिकॉर्ड अपडेट करने के लिए एक अद्यतन ट्रिगर है, तो यह अद्यतन ट्रिगर को लागू करेगा तालिका A जो पुनरावर्ती रूप से होगी।

आइए नीचे दी गई स्क्रिप्ट का उपयोग करके IDR_Test1 और IDR_Test2 तालिकाओं पर एक अप्रत्यक्ष पुनरावर्ती ट्रिगर बनाएं:

DROP TABLE IDR_Test1
DROP TABLE IDR_Test2

CREATE TABLE IDR_Test1 (PK int NOT NULL);
GO
INSERT INTO IDR_Test1 
values (10),(20)
GO
CREATE TABLE IDR_Test2 (PK int NOT NULL);
GO
INSERT INTO IDR_Test2
values (10),(20)
GO

CREATE TRIGGER TR_IDR_Test1
ON IDR_Test1
FOR UPDATE 
AS
BEGIN
	UPDATE IDR_Test2
	SET PK = 30
	WHERE PK IN (SELECT PK FROM inserted);
END
GO
 
CREATE TRIGGER TR_Temp2
ON IDR_Test2
FOR UPDATE 
AS
BEGIN
	UPDATE IDR_Test1
	SET PK = 30
	WHERE PK IN (SELECT PK FROM inserted);
END
GO

नीचे दी गई स्क्रिप्ट निष्पादित करें:

UPDATE IDR_Test1
SET PK = 1
WHERE PK = 10;

डेटाबेस स्तर पर इस प्रकार के रिकर्सिव ट्रिगर्स इनवोकेशन से बचने के लिए, SQL सर्वर के पास रिकर्सिव ट्रिगर ट्रिगरिंग को तोड़ने के लिए प्रत्येक डेटाबेस स्तर पर RECURSIVE_TRIGGERS नामक एक विकल्प होता है। डिफ़ॉल्ट रूप से, पुनरावर्ती ट्रिगर विकल्प डेटाबेस के लिए गलत पर सेट होता है। प्रदर्शन प्रभावों या शामिल डेटा परिवर्तनों पर सावधानीपूर्वक विचार करने के बाद ही आवश्यकतानुसार सक्षम करें।

SSMS में, हमारे परीक्षण डेटाबेस पर राइट-क्लिक करें -> चुनें गुण -> विकल्प क्लिक करें और यह देखने के लिए नीचे स्क्रॉल करें कि रिकर्सिव ट्रिगर्स विकल्प सक्षम है या नहीं जैसा कि नीचे दिखाया गया है। टेस्ट डेटाबेस के लिए, इसे गलत पर सेट किया गया है क्योंकि रिकर्सिव ट्रिगर्स विकल्प के लिए गलत डिफ़ॉल्ट मान है। किसी विशिष्ट डेटाबेस के लिए पुनरावर्ती ट्रिगर विकल्प चालू करने के लिए, बस ड्रॉपडाउन मान पर क्लिक करें, इसे सही में बदलें और ठीक क्लिक करें।

टी-एसक्यूएल के माध्यम से, हम नीचे दिखाए गए अनुसार sys.databases DMV से is_recursive_triggers_on कॉलम को चेक करके टेस्ट डेटाबेस के रिकर्सिव ट्रिगर विकल्प को सत्यापित कर सकते हैं।

select name, is_recursive_triggers_on
from sys.databases
where name = 'test'

डेटाबेस के लिए रिकर्सिव ट्रिगर्स विकल्प को बदलने के लिए (मेरे उदाहरण में परीक्षण करें), हम नीचे दी गई स्क्रिप्ट को निष्पादित कर सकते हैं।

ALTER DATABASE [Test] SET RECURSIVE_TRIGGERS ON WITH NO_WAIT
GO

डेटाबेस के लिए इसे वापस झूठी स्थिति (डिफ़ॉल्ट स्थिति) में अक्षम करने के लिए (मेरे उदाहरण में परीक्षण करें), नीचे दी गई स्क्रिप्ट को निष्पादित करें।

ALTER DATABASE [Test] SET RECURSIVE_TRIGGERS OFF WITH NO_WAIT
GO

नेस्टेड ट्रिगर

रिकर्सिव ट्रिगर्स नेस्टेड ट्रिगर्स का एक उत्कृष्ट उदाहरण हैं, लेकिन कुछ अन्य मामले भी हो सकते हैं जिसके परिणामस्वरूप कई ट्रिगर्स नेस्टिंग हो सकते हैं। SQL सर्वर ट्रिगर्स को अधिकतम 32 स्तरों तक नेस्टिंग करने की अनुमति देता है और उस नेस्टिंग स्तर से अधिक किसी भी ट्रिगर को SQL सर्वर द्वारा रद्द कर दिया जाएगा। नेस्टेड ट्रिगर्स विकल्प को अक्षम करने के लिए SQL सर्वर में इंस्टेंस-वाइड कॉन्फ़िगरेशन है। कृपया ध्यान दें कि SQL सर्वर का नेस्टिंग CLR कोड या प्रबंधित कोड का उपयोग कर ट्रिगर करता है जो 32 स्तरों की सीमा के अंतर्गत नहीं आता है क्योंकि यह SQL सर्वर के दायरे से बाहर है। डिफ़ॉल्ट रूप से, नेस्टेड ट्रिगर विकल्प सभी SQL सर्वर इंस्टेंस में सक्षम किया जाएगा और हम इसे आवश्यकतानुसार अक्षम कर सकते हैं।

हम नीचे दिए गए चरणों का पालन करके सत्यापित कर सकते हैं कि SSMS में नेस्टेड ट्रिगर्स विकल्प इंस्टेंस स्तर पर सक्षम है या नहीं:

सर्वर पर राइट-क्लिक करें -> चुनें गुण -> उन्नत . क्लिक करें

नेस्टेड ट्रिगर विकल्प को अक्षम या बंद करने के लिए, ड्रॉपडाउन पर क्लिक करें और इसे गलत में बदलें, और ठीक पर क्लिक करें

टी-एसक्यूएल के माध्यम से, हम नेस्टेड ट्रिगर्स कॉन्फ़िगरेशन नाम के लिए sys.configurations DMV में value_in_use कॉलम की जांच करके सत्यापित कर सकते हैं कि नेस्टेड ट्रिगर्स विकल्प सक्षम है या नहीं।

इस विकल्प को अक्षम करने के लिए, हमें नीचे दिखाए गए अनुसार सिस्टम संग्रहीत कार्यविधि sp_configure का उपयोग करने की आवश्यकता है:

EXEC sp_configure 'nested triggers', 0;  
GO  
RECONFIGURE;  
GO  

किसी भी डीएमएल या डीडीएल ट्रिगर के भीतर, नेस्टिंग के वर्तमान स्तर को खोजने के लिए SQL सर्वर में TRIGGER_NESTLEVEL नामक एक अंतर्निहित फ़ंक्शन होता है जो वर्तमान स्टेटमेंट के लिए निष्पादित ट्रिगर्स की संख्या को वापस करने के लिए ट्रिगर करता है, जिसमें स्वयं भी शामिल है। TRIGGER_NESTLEVEL फ़ंक्शन का सिंटैक्स होगा:

SELECT TRIGGER_NESTLEVEL ( object_id, <trigger_type> , <trigger_event_category> )

जहां ऑब्जेक्ट_आईडी ट्रिगर की ऑब्जेक्ट आईडी है, ट्रिगर_टाइप ट्रिगर के बाद के लिए होगा और ट्रिगर के स्थान पर आईओटी और ट्रिगर_इवेंट_श्रेणी या तो डीएमएल या डीडीएल होगा।

उदाहरण के लिए, यदि हमें केवल 10 तक नेस्टिंग स्तर की अनुमति देने और 10 स्तरों के बाद त्रुटि बढ़ाने की आवश्यकता है, तो हम इसे यहां परीक्षण ट्रिगर पर कर सकते हैं:

IF ((SELECT TRIGGER_NESTLEVEL(OBJECT_ID('test_trigger'), 'AFTER’, 'DML’)) > 10)  
   RAISERROR ('Trigger test_trigger nested more than 10 levels.',16, -1)   

एन्क्रिप्शन

ट्रिगर तर्क या परिभाषा को एन्क्रिप्ट करने के लिए, एन्क्रिप्शन विकल्प के साथ अन्य सभी SQL सर्वर ऑब्जेक्ट्स के समान ट्रिगर परिभाषा में उपयोग किया जा सकता है।

अनुच्छेद के रूप में निष्पादित करें

एक विशिष्ट सुरक्षा संदर्भ का उपयोग करके ट्रिगर को निष्पादित करने के लिए, ट्रिगर परिभाषा में EXECUTE AS क्लॉज का उपयोग किया जा सकता है।

प्रतिकृति के लिए नहीं

यह पहचानने के लिए कि प्रतिकृति परिवर्तनों के माध्यम से निष्पादित करते समय डीएमएल ट्रिगर को लागू नहीं किया जाना चाहिए, सब्सक्राइबर डेटाबेस में सभी ऑब्जेक्ट्स के लिए प्रतिकृति के लिए नहीं संपत्ति सेट की जाएगी।

निष्कर्ष

डीडीएल ट्रिगर्स और लॉगऑन ट्रिगर्स पर पावर-पैक लेख के माध्यम से जाने के लिए धन्यवाद, जहां हमने डीडीएल और लॉगऑन ट्रिगर्स के उद्देश्य को समझा है, इन ट्रिगर्स को कैसे बनाएं या ड्रॉप करें, अक्षम करें या सक्षम करें, साथ ही साथ EVENTDATA () फ़ंक्शन का उपयोग कैसे करें। डीडीएल या लॉगऑन गतिविधियों पर नज़र रखना। इसके अलावा, हमने सीखा है कि रिकर्सिव और नेस्टेड ट्रिगर्स के साथ कई SQL DML या DDL ट्रिगर्स के एक्ज़ीक्यूशन ऑर्डर को कैसे सेट किया जाए और रिकर्सिव या नेस्टेड ट्रिगर्स को सावधानी से कैसे हैंडल किया जाए।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्लस्टर्ड और नॉन-क्लस्टर इंडेक्स के बीच अंतर क्या हैं?

  2. परिणाम के रूप में पूर्ण दिनांक-समय मान के साथ SQL सर्वर में प्रति घंटे पंक्तियों की गणना करें

  3. SQL सर्वर में क्रॉस-डेटाबेस ऑब्जेक्ट्स पर OBJECT_ID () का उपयोग कैसे करें

  4. SQL सर्वर स्ट्रिंग को डेटाटाइम में कनवर्ट करता है

  5. SQL सर्वर में डेटाबेस की सभी तालिकाओं के बीच संबंध जानें