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

SQL सर्वर ट्रिगर:DML ट्रिगर

SQL सर्वर में, ट्रिगर डेटाबेस ऑब्जेक्ट होते हैं जो डेटाबेस या सर्वर पर ट्रिगरिंग ईवेंट होने पर निष्पादित हो जाते हैं।

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

इस लेख में, हम ट्रिगर, ट्रिगर के प्रकार और उपलब्ध विभिन्न ट्रिगर विकल्पों की जांच करेंगे। साथ ही, हम DML ट्रिगर का उपयोग करते समय आवश्यक सावधानियों का पता लगाएंगे।

ट्रिगर एसक्यूएल में

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

  • डीएमएल ट्रिगर - टेबल पर INSERT, UPDATE और DELETE कमांड जैसे DML ऑपरेशन करने के लिए।
  • डीडीएल ट्रिगर - डेटाबेस या सर्वर पर किसी भी ऑब्जेक्ट में DDL संचालन जैसे CREATE, ALTER, और DROP कमांड करने के लिए।
  • लॉगऑन ट्रिगर - लॉगऑन इवेंट के दौरान SQL सर्वर के इंस्टेंस में लॉग इन करने के प्रयास के लिए।

SQL सर्वर में DML ट्रिगर

DML ट्रिगर वे होते हैं जिन्हें DML कमांड (INSERT, UPDATE, या DELETE) द्वारा टेबल या व्यू पर फ़ायर किया जाता है। हम ऐसे ट्रिगर केवल उन टेबल या व्यू पर बना सकते हैं जहां डेटा रहता है ताकि वे उन पर डीएमएल कमांड स्वीकार कर सकें।

फायरिंग/आह्वान के समय के आधार पर, डीएमएल ट्रिगर निम्न प्रकार के हो सकते हैं:

  • के लिए या बाद ट्रिगर प्रकार - किसी टेबल या व्यू पर डीएमएल स्टेटमेंट के सफलतापूर्वक पूरा होने के बाद ट्रिगर को इनवाइट किया जाता है। नोट:केवल टेबल्स पर ट्रिगर बनाना संभव है, दृश्य नहीं।
  • के बजाय ट्रिगर प्रकार - ट्रिगर को टेबल या व्यू पर निष्पादित DML स्क्रिप्ट से पहले (इसके बजाय) लागू किया जाएगा।

SQL सर्वर INSERTED . नामक दो विशेष या तार्किक तालिकाएँ बनाता है और अपडेट किया गया जब भी टेबल्स या व्यू में डीएमएल ट्रिगर्स बनाए जाते हैं। ये तार्किक तालिकाएँ INSERT/UPDATE/ DELETE संचालन के माध्यम से होने वाले रिकॉर्ड परिवर्तनों की पहचान करने में मदद करती हैं। इस तरह, यह सुनिश्चित करता है कि DML ट्रिगर प्रभावी ढंग से कार्य करें।

  • सम्मिलित तार्किक तालिका INSERT और UPDATE संचालन के दौरान संशोधित रिकॉर्ड के नए रिकॉर्ड की प्रतियां संग्रहीत करती है। जब वास्तविक तालिका में एक नया रिकॉर्ड जोड़ा जाता है, तो उसे सम्मिलित तालिका में भी जोड़ा जाता है। इसी तरह, अद्यतन विवरण के माध्यम से मौजूदा रिकॉर्ड में कोई भी परिवर्तन नवीनतम मानों को INSERTED तालिका में और पुराने मानों को - हटाए गए तार्किक तालिका में ले जाता है।
  • हटाया गया तार्किक तालिका अद्यतन और DELETE संचालन के दौरान पुराने मूल्यों की प्रतियां संग्रहीत करती है। जब भी कोई रिकॉर्ड अपडेट किया जाता है, पुराने मान DELETED तालिका में कॉपी हो जाते हैं। जब भी वास्तविक तालिका से कोई रिकॉर्ड हटा दिया जाता है, तो रिकॉर्ड हटाए गए तालिका में सम्मिलित हो जाते हैं।

SQL सर्वर में अंतर्निहित कार्य हैं COLUMN_UPDATED() और अद्यतन करें () विशेष कॉलम पर INSERT या UPDATE संचालन की उपस्थिति की पहचान करने के लिए।

  • COLUMN_UPDATED() INSERT या UPDATE संचालन से प्रभावित स्तंभों के varbinary मान लौटाता है।
  • अद्यतन() कॉलम नाम को इनपुट पैरामीटर के रूप में स्वीकार करता है और यह जानकारी देता है कि क्या उस कॉलम में INSERT या UPDATE संचालन के हिस्से के रूप में कोई डेटा परिवर्तन है।

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

डीएमएल ट्रिगर्स को नेट फ्रेमवर्क कॉमन लैंग्वेज रनटाइम (सीएलआर) के साथ भी बनाया जा सकता है।

सिस्टम DMV sys.triggers सभी डेटाबेस-स्कोप्ड ट्रिगर्स की सूची संग्रहीत करता है। डेटाबेस में सभी डीएमएल ट्रिगर्स का विवरण प्राप्त करने के लिए हम नीचे दी गई क्वेरी का उपयोग कर सकते हैं:

SELECT * 
FROM sys.triggers
WHERE type = 'TR';

यदि ट्रिगर एन्क्रिप्ट नहीं किया गया है तो DML ट्रिगर परिभाषाएँ देखी जा सकती हैं। हम नीचे दिए गए विकल्पों में से किसी का भी उपयोग करते हैं:

sys.sql_modules

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>);   

OBJECT_DEFINITION() समारोह

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

sp_helptext संग्रहित प्रक्रिया

EXEC sp_helptext '<trigger_name>';

सभी संभावित डीएमएल कार्यक्रम sys.events . में उपलब्ध हैं टेबल। हम उन्हें नीचे दी गई क्वेरी का उपयोग करके देख सकते हैं:

SELECT * 
FROM sys.events;

DML ट्रिगर का सिंटैक्स

CREATE TRIGGER <trigger_name>
ON <schema_name.table_name | schema_name.view_name > 
[ WITH <DML_trigger_option> [ ,...n ] ]  
{ FOR | AFTER | INSTEAD OF} <event_type>
AS { sql_statement | EXTERNAL NAME <method specifier> }  

डेमो उद्देश्यों के लिए, मैंने बिक्री . नाम से दो टेबल बनाए हैं और बिक्री इतिहास परीक्षण डेटाबेस में कुछ स्तंभों के साथ:

CREATE TABLE Sales (SalesId int IDENTITY NOT NULL, SalesDate datetime, Itemcount int, price money);
CREATE TABLE SalesHistory (SalesId int NOT NULL, SalesDate datetime, Itemcount int, price money, ChangeType varchar(10), ChangeDate datetime DEFAULT GETDATE(), ChangedUser varchar(100) DEFAULT SUSER_NAME());
GO

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

ट्रिगर डालें

हम बिक्री . पर एक आसान INSERT ट्रिगर बनाते हैं INSERT के लिए तालिकाएँ विक्रय इतिहास . में किसी भी नए रिकॉर्ड में परिवर्तन करती हैं टेबल। नीचे दी गई स्क्रिप्ट का प्रयोग करें:

CREATE TRIGGER TR_INS_Sales ON Sales
FOR INSERT 
AS
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    	,SalesDate
	,Itemcount
	,price
	,'INSERT'
  FROM inserted
END
GO

ट्रिगर सिंटैक्स की व्याख्या करने के लिए, हमने TR_INS_Sales नाम का एक DML ट्रिगर बनाया है बिक्री . पर टेबल। इसे केवल INSERT संचालन के लिए ट्रिगर सक्रिय करना चाहिए - बिक्री इतिहास में रिकॉर्ड सम्मिलित करना सम्मिलित तालिका से तालिका।

जैसा कि हम जानते हैं, सम्मिलित एक तार्किक तालिका है जो स्रोत तालिका में हो रहे परिवर्तनों को कैप्चर करती है (बिक्री हमारे मामले में तालिका)।

हम एक और विशेष तार्किक तालिका को UPDATE ट्रिगर में हटाते हुए देख सकते हैं क्योंकि हटाई गई तालिका INSERT ट्रिगर के लिए लागू नहीं है।

आइए यह जांचने के लिए एक नया रिकॉर्ड जोड़ें कि रिकॉर्ड बिक्री इतिहास में डाले गए हैं या नहीं तालिका स्वचालित रूप से।

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-01-01', 5, 100);

भले ही हमने बिक्री . में केवल एक रिकॉर्ड डाला है तालिका, हमें 1 पंक्ति प्रभावित . की 2 पंक्तियाँ मिलती हैं संदेश। दूसरा रिकॉर्ड INSERT ऑपरेशन के कारण बिक्री पर INSERT गतिविधि द्वारा ट्रिगर किए गए ट्रिगर के हिस्से के रूप में दिखाई देता है तालिका - बिक्री इतिहास . में एक रिकॉर्ड सम्मिलित करना टेबल।

आइए दोनों बिक्री . के रिकॉर्ड को सत्यापित करें और बिक्री इतिहास टेबल:

SELECT * 
FROM Sales

SELECT * 
FROM SalesHistory

हम देख सकते हैं कि परिवर्तन दिनांक और बदला हुआ उपयोगकर्ता स्वतः भर जाते हैं। ऐसा इसलिए है क्योंकि हमने अपना इतिहास . तैयार किया है GETDATE() . के रूप में डिफ़ॉल्ट मानों वाली तालिका और SUSER_NAME()

अंतिम उपयोगकर्ता ट्रिगर या किसी अन्य माध्यम से देख सकते हैं कि उनके INSERT को अतिरिक्त प्रभावित 1 पंक्ति के माध्यम से ऑडिट किया गया था संदेश। यदि आप उपयोगकर्ताओं को सूचित किए बिना परिवर्तनों की निगरानी करना चाहते हैं, तो आपको सेट ROWCOUNT ON लागू करना होगा आज्ञा। यह ट्रिगर के अंदर होने वाले DML संचालन के लिए प्रदर्शित परिणामों को दबा देता है।

आइए सेट ROWCOUNT ON . के साथ स्क्रिप्ट का उपयोग करके अपने ट्रिगर को बदलें विकल्प चुनें और इसे क्रिया में देखें:

ALTER TRIGGER TR_INS_Sales ON Sales
FOR INSERT 
AS
BEGIN
SET NOCOUNT ON
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'INSERT'
  FROM inserted
END
GO

अब, हम बिक्री . में एक और रिकॉर्ड सम्मिलित करते हैं तालिका:

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-02-01', 1, 50);

हम केवल एक 1 पंक्ति प्रभावित देख सकते हैं संदेश। इस प्रकार, लक्षित दर्शकों को यह सूचित नहीं किया जा सकता है कि उनके कार्यों की निगरानी बिल्कुल भी की जा रही है।

आइए सत्यापित करें कि बिक्री . को सत्यापित करके INSERT ट्रिगर लागू किया गया था या नहीं और बिक्री इतिहास टेबल.

हां, बिक्री . पर INSERT इवेंट तालिका को सफलतापूर्वक ट्रिगर किया गया था। रिकॉर्ड बिक्री इतिहास . में सम्मिलित किए गए थे उपयोगकर्ताओं को सूचित किए बिना तालिका।

इसलिए, यदि आप ऑडिटिंग उद्देश्यों के लिए ट्रिगर बनाते हैं, तो NOCOUNT ON करें आवश्यक है। यह बिना किसी को सचेत किए ऑडिटिंग की अनुमति देता है।

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

बिक्री . पर वास्तविक अद्यतन ट्रिगर बनाने से पहले तालिका, आइए फिर से विशेष तार्किक सम्मिलित और हटाए गए तालिकाओं को देखें। बिक्री . पर एक नमूना अद्यतन ट्रिगर बनाएं तालिका:

CREATE TRIGGER TR_UPD_Sales ON Sales
FOR UPDATE 
AS
BEGIN
SELECT * FROM inserted
SELECT * FROM deleted
END
GO

अद्यतन ट्रिगर सफलतापूर्वक बनाया गया था। अब, गलत तरीके से INSERT एक नया रिकॉर्ड करते हैं। बाद में हम अद्यतन ट्रिगर को क्रिया में सत्यापित करने के लिए इसे अपडेट करेंगे:

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-02-01', 1, 50);

हमारे पास बिक्री में नीचे दिए गए रिकॉर्ड हैं और बिक्री इतिहास तालिका:

आइए अपडेट करते हैं SalesId =3 बिक्री . में नए मूल्यों के साथ तालिका। हम सम्मिलित और हटाई गई तालिकाओं में डेटा देखेंगे:

UPDATE Sales
SET SalesDate = '2021-03-01'
	, Itemcount = 3
	, price = 500
WHERE SalesId = 3

जब अद्यतन कार्रवाई होती है, तो सभी नए या संशोधित मान सम्मिलित तालिका में उपलब्ध होंगे, और पुराने मान हटाए गए तालिका में उपलब्ध होंगे:

अब, नीचे दी गई स्क्रिप्ट के साथ अद्यतन ट्रिगर को संशोधित करें और इसे क्रिया में सत्यापित करें:

ALTER TRIGGER TR_UPD_Sales ON Sales
FOR UPDATE 
AS
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'UPDATE'
  FROM inserted
END
GO

अद्यतन ट्रिगर सफलतापूर्वक बदल दिया गया था, और हम उसी अद्यतन स्क्रिप्ट को फिर से निष्पादित कर सकते हैं:

अब, हम 1 पंक्ति प्रभावित . देख सकते हैं दो बार संदेश। यह बिक्री . पर अद्यतन कार्रवाई के निष्पादन को इंगित करता है बिक्री इतिहास . पर तालिका और INSERT संचालन टेबल। आइए दोनों तालिकाओं में चयन करके इसे सत्यापित करें:

UPDATE गतिविधि को बिक्री इतिहास . में ट्रैक किया गया एक नए रिकॉर्ड के रूप में तालिका। उस रिकॉर्ड से पहले, हमारे पास एक और रिकॉर्ड है जो दिखाता है कि रिकॉर्ड को पहले कब डाला गया था।

ट्रिगर हटाएं

अब तक, हमने के लिए . का परीक्षण किया है या के बाद INSERT या UPDATE ऑपरेशंस दोनों के लिए ट्रिगर्स के प्रकार। अब, हम इसके बजाय . का उपयोग करने का प्रयास कर सकते हैं DELETE ऑपरेशन के लिए DML ट्रिगर का प्रकार। नीचे दी गई स्क्रिप्ट का प्रयोग करें:

CREATE TRIGGER TR_DEL_Sales ON Sales
INSTEAD OF DELETE 
AS
BEGIN
	RAISERROR ('Notify Sales Team', 16, 10);  
END
GO

DELETE ट्रिगर सफलतापूर्वक बनाया गया है। यह बिक्री पर DELETE कमांड निष्पादित करने के बजाय क्लाइंट को एक त्रुटि संदेश भेजेगा टेबल।

आइए रिकॉर्ड को हटाने का प्रयास करें SalesID =3 बिक्री . से नीचे दी गई स्क्रिप्ट का उपयोग कर तालिका:

DELETE FROM Sales
WHERE SalesId = 3

हमने उपयोगकर्ताओं को बिक्री . से रिकॉर्ड हटाने से रोका है टेबल। ट्रिगर ने एक त्रुटि संदेश उठाया।

आइए यह भी सत्यापित करें कि रिकॉर्ड बिक्री . से हटा दिया गया था या नहीं तालिका और यदि बिक्री इतिहास . में कोई परिवर्तन हुआ है तालिका:

चूंकि हमने INSTEAD OF ट्रिगर का उपयोग करके वास्तविक DELETE स्टेटमेंट से पहले ट्रिगर स्क्रिप्ट को निष्पादित किया है, SalesId =3 पर DELETE ऑपरेशन बिल्कुल भी सफल नहीं था। इसलिए, बिक्री . दोनों में कोई बदलाव नहीं दिखा और बिक्री इतिहास टेबल।

आइए तालिका पर DELETE प्रयास की पहचान करने के लिए नीचे दी गई स्क्रिप्ट का उपयोग करके ट्रिगर को संशोधित करें:

ALTER TRIGGER TR_DEL_Sales ON Sales
INSTEAD OF DELETE 
AS
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'DELETE ATP'
  FROM deleted 
END
GO

ट्रिगर को सफलतापूर्वक संशोधित किया गया था। आइए SalesId =3 को हटा दें बिक्री . से रिकॉर्ड करें तालिका फिर से:

DELETE कथन का निष्पादन 1 पंक्ति प्रभावित . दिखाता है दो बार संदेश। आइए बिक्री के रिकॉर्ड देखें और बिक्री इतिहास टेबल देखने के लिए कि वास्तव में वहां क्या होता है:

DELETE ट्रिगर में प्रयुक्त तर्क बिक्री से रिकॉर्ड को वास्तव में हटाए बिना तालिका पर किसी भी DELETE प्रयासों को कैप्चर करना था इसके बजाय . का उपयोग कर तालिका चालू कर देना। हम पुष्टि कर सकते हैं कि रिकॉर्ड बिक्री . से हटाया नहीं गया था तालिका, और एक नया रिकॉर्ड बिक्री इतिहास . में डाला गया टेबल।

INSERT, UPDATE और DELETE ऑपरेशन को हैंडल करने के लिए सिंगल ट्रिगर

अब तक, हमने एक ही टेबल पर INSERT, UPDATE और DELETE संचालन को संभालने के लिए 3 ट्रिगर बनाए हैं। यदि हमारे पास कई ट्रिगर हैं, तो उन्हें प्रबंधित करना मुश्किल होगा, खासकर यदि वे ठीक से प्रलेखित नहीं हैं। यदि डेवलपर्स एकाधिक ट्रिगर्स में विरोधाभासी तर्क का उपयोग करते हैं तो प्रदर्शन संबंधी समस्याएं हो सकती हैं।

मैं व्यक्तिगत रूप से संभावित डेटा हानि या प्रदर्शन समस्याओं से बचने के लिए सभी तर्कों के साथ एकल ट्रिगर का उपयोग करने की सलाह देता हूं। हम बेहतर प्रदर्शन के लिए एक ही ट्रिगर में 3 ट्रिगर्स को मिलाने की कोशिश कर सकते हैं। लेकिन ऐसा करने से पहले, आइए देखें कि मौजूदा ट्रिगर्स को कैसे DROP करें और ट्रिगर्स को डिसेबल या इनेबल कैसे करें।

ट्रिगर छोड़ें

3 ट्रिगर्स को एक में मर्ज करने के लिए, हमें सबसे पहले इन 3 ट्रिगर्स को DROP करना होगा। यह SSMS और T-SQL दोनों तरीकों से संभव है।

SSMS में, परीक्षण का विस्तार करें डेटाबेस > टेबल्स > बिक्री तालिका> ट्रिगर

हम अब तक बनाए गए हमारे 3 ट्रिगर देख सकते हैं:

किसी ट्रिगर को छोड़ने के लिए, बस उस पर राइट-क्लिक करें> हटाएं > ठीक

यदि आप T-SQL का उपयोग करना पसंद करते हैं, तो ट्रिगर को छोड़ने के लिए नीचे दिया गया सिंटैक्स देखें:

DROP TRIGGER <trigger_name>

TR_INS_बिक्री है ट्रिगर जिसे हमने बिक्री . पर बनाया है टेबल। स्क्रिप्ट होगी:

DROP TRIGGER TR_INS_Sales

महत्वपूर्ण :किसी तालिका को छोड़ने से सभी ट्रिगर डिफ़ॉल्ट रूप से गिर जाते हैं।

ट्रिगर अक्षम और सक्षम करें

ट्रिगर को छोड़ने के बजाय, हम इसे अस्थायी रूप से अक्षम करें . के साथ अक्षम कर सकते हैं ट्रिगर SSMS या T-SQL के माध्यम से विकल्प।

SSMS में, ट्रिगर नाम . पर राइट-क्लिक करें> अक्षम करें . एक बार अक्षम हो जाने पर ट्रिगर को तब तक सक्रिय नहीं किया जाएगा जब तक कि आप इसे वापस सक्षम नहीं कर देते।

जब ट्रिगर काम कर रहा हो, सक्षम करें विकल्प धूसर हो गया है। जब आप इसे अक्षम करते हैं, तो सक्षम करें विकल्प दृश्यमान और सक्रिय हो जाएगा।

यदि आप टी-एसक्यूएल का उपयोग करना पसंद करते हैं, तो आप नीचे दी गई स्क्रिप्ट का उपयोग करके ट्रिगर्स को अक्षम और सक्षम कर सकते हैं:

-- To Disable all triggers on a specific table
DISABLE TRIGGER ALL ON <table_name>;

-- To Disable a specific trigger on a table
DISABLE TRIGGER <trigger_name> ON <table_name>;

-- To Enable all triggers on a specific table
ENABLE TRIGGER ALL ON <table_name>;

-- To Enable a specific trigger on a table
ENABLE TRIGGER <trigger_name> ON <table_name>;

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

-- To Disable TR_INS_Sales trigger on Sales table
DISABLE TRIGGER TR_INS_Sales ON Sales;

-- To Enable TR_INS_Sales trigger on Sales table
ENABLE TRIGGER TR_INS_Sales ON Sales;

इस प्रकार, हमने सीखा है कि कैसे DROP , अक्षम करें , और सक्षम करें ट्रिगर। मैं 3 मौजूदा ट्रिगर्स को छोड़ दूंगा और सभी 3 ऑपरेशनों को कवर करने वाला या नीचे दी गई स्क्रिप्ट का उपयोग करके डालने, अपडेट करने और हटाने के लिए एक एकल ट्रिगर बनाऊंगा:

DROP TRIGGER TR_INS_Sales
DROP TRIGGER TR_UPD_Sales
DROP TRIGGER TR_DEL_Sales
GO

CREATE TRIGGER TR_INS_UPD_DEL_Sales ON Sales
FOR INSERT, UPDATE, DELETE
AS
BEGIN
IF (SELECT COUNT (*) FROM deleted) = 0
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'INSERT'
  FROM inserted
END
ELSE IF (SELECT COUNT (*) FROM inserted) = 0
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'DELETE'
  FROM deleted
END
ELSE IF (UPDATE (SalesDate) OR UPDATE (ItemCount) OR UPDATE (Price))
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'UPDATE'
  FROM inserted
END 
END
GO

एकल ट्रिगर निर्माण सफल रहा। हमने सम्मिलित और हटाए गए तालिकाओं का उपयोग करके ऑपरेशन की पहचान करने के लिए तर्क का उपयोग किया है।

INSERT ऑपरेशन के लिए, हटाई गई तालिका को पॉप्युलेट नहीं किया जाएगा। DELETE ऑपरेशन के लिए, सम्मिलित तालिका को पॉप्युलेट नहीं किया जाएगा। हम इन कार्यों को आसानी से पहचान सकते हैं। अगर ये 2 शर्तें मेल नहीं खा रही हैं तो यह एक UPDATE ऑपरेशन है, और हम एक साधारण ELSE स्टेटमेंट का उपयोग कर सकते हैं।

मैंने अपडेट () . का उपयोग किया है यह दिखाने के लिए कार्य करता है कि यह कैसे काम करता है। अगर उन कॉलम में कोई अपडेट होता, तो UPDATE ट्रिगर कार्रवाई सक्रिय हो जाती। हम COLUMNS_UPDATED() . का भी उपयोग कर सकते हैं फ़ंक्शन जिसकी हमने पहले एक अद्यतन कार्रवाई की पहचान करने के लिए चर्चा की थी।

आइए एक नया रिकॉर्ड सम्मिलित करके हमारे नए ट्रिगर का परीक्षण करें:

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-04-01', 4, 400);

बिक्री में रिकॉर्ड सत्यापित करना और बिक्री इतिहास तालिकाएं नीचे के रूप में डेटा दिखाती हैं:

आइए SalesId =2 को अपडेट करने का प्रयास करें रिकॉर्ड:

UPDATE Sales
SET price = 250
WHERE SalesId = 2;

आइए SalesId =4 पर इस प्रक्रिया के माध्यम से एक DELETE स्क्रिप्ट का प्रयास करें रिकॉर्ड:

DELETE FROM Sales
WHERE SalesId = 4;

जैसा कि हम देख सकते हैं, SalesId =4 बिक्री . से हटा दिया गया था तालिका क्योंकि यह के लिए . है या बाद ट्रिगर, DELETE ऑपरेशन को बिक्री . पर सफल बनाने के लिए तालिका और फिर बिक्री इतिहास . में एक रिकॉर्ड डालें टेबल।

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

DML ट्रिगर निम्नलिखित परिदृश्यों के लिए प्रभावी ढंग से काम करते हैं:

  1. एक विशिष्ट तालिका पर INSERT, UPDATE, और DELETE संचालन के ऐतिहासिक परिवर्तनों को ट्रैक करें।
  2. उपयोगकर्ताओं को ऑडिटिंग गतिविधि को उजागर किए बिना टेबल पर होने वाली डीएमएल घटनाओं का ऑडिट करें।
  3. DML परिवर्तनों को इसके बजाय . के माध्यम से तालिका पर होने से रोकें एक विशिष्ट त्रुटि संदेश के साथ उपयोगकर्ताओं को ट्रिगर और सचेत करता है।
  4. किसी भी पूर्वनिर्धारित शर्तों को प्राप्त करने पर लक्षित लोगों को सूचनाएं भेजें।
  5. किसी भी पूर्वनिर्धारित शर्तों को प्राप्त करते समय SQL सर्वर एजेंट कार्य या कोई अन्य प्रक्रिया प्रारंभ करें।

और, आप उनका उपयोग किसी भी अन्य व्यावसायिक तर्क आवश्यकताओं के लिए कर सकते हैं जिन्हें आप T-SQL कथनों के साथ कार्यान्वित कर सकते हैं।

निष्कर्ष

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

भले ही SQL सर्वर एक ही टेबल पर कई ट्रिगर बनाने का समर्थन करता है, लेकिन एक ट्रिगर को समेकित करना बेहतर है। इस तरह, आप ट्रिगर्स को आसानी से बनाए रख सकते हैं और उनका तेजी से निवारण कर सकते हैं। जब भी डीएमएल ट्रिगर्स को ऑडिटिंग उद्देश्यों के लिए लागू किया जाता है, तो सुनिश्चित करें कि NOCOUNT ON करें विकल्प का प्रभावी ढंग से उपयोग किया जाता है।

अगले लेख में, हम डीडीएल ट्रिगर और लॉगऑन ट्रिगर की जांच करेंगे।


  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 में नई xml नोड प्रविष्टि को अद्यतन करने या बनाने के लिए IF/ELSE कथन का उपयोग कैसे करें

  2. NVARCHAR(MAX) के लिए अधिकतम वर्ण क्या हैं?

  3. DATENAME() SQL सर्वर में उदाहरण

  4. ईएफ 6 - समानांतर प्रश्नों को सही ढंग से कैसे करें

  5. SQL सर्वर (T-SQL) में वर्तमान सत्र की भाषा प्राप्त करने के 3 तरीके