डेटाबेस ट्रिगर: Difference between revisions
No edit summary |
No edit summary |
||
Line 5: | Line 5: | ||
नीचे कुछ लोकप्रिय डीबीएमएस समर्थन ट्रिगर्स के विवरण की श्रृंखला दी गई है। | नीचे कुछ लोकप्रिय डीबीएमएस समर्थन ट्रिगर्स के विवरण की श्रृंखला दी गई है। | ||
=== | === आकाशवाणी === | ||
डेटा संशोधित होने पर उस आग (और पीएल/एसक्यूएल कोड को निष्पादित) ट्रिगर करने के अतिरिक्त, [[ओरेकल डाटाबेस]] उस ट्रिगर का समर्थन करता है जब स्कीमा-स्तरीय ऑब्जेक्ट्स (अर्थात, टेबल) संशोधित होते हैं और जब उपयोगकर्ता लॉगऑन या लॉगऑफ घटनाएं होती हैं। | डेटा संशोधित होने पर उस आग (और पीएल/एसक्यूएल कोड को निष्पादित) ट्रिगर करने के अतिरिक्त, [[ओरेकल डाटाबेस|आकाशवाणी डाटाबेस]] उस ट्रिगर का समर्थन करता है जब स्कीमा-स्तरीय ऑब्जेक्ट्स (अर्थात, टेबल) संशोधित होते हैं और जब उपयोगकर्ता लॉगऑन या लॉगऑफ घटनाएं होती हैं। | ||
==== स्कीमा-लेवल ट्रिगर्स ==== | ==== स्कीमा-लेवल ट्रिगर्स ==== | ||
Line 18: | Line 18: | ||
चार मुख्य प्रकार के ट्रिगर हैं: | चार मुख्य प्रकार के ट्रिगर हैं: | ||
# रो-लेवल ट्रिगर: यह किसी पंक्ति परिवर्तन के किसी भी कॉलम मान से | # रो-लेवल ट्रिगर: यह किसी पंक्ति परिवर्तन के किसी भी कॉलम मान से पूर्व या पश्चात में निष्पादित हो जाता है | ||
# कॉलम-स्तरीय ट्रिगर: निर्दिष्ट कॉलम परिवर्तन से | # कॉलम-स्तरीय ट्रिगर: निर्दिष्ट कॉलम परिवर्तन से पूर्व या पश्चात में इसे निष्पादित किया जाता है | ||
# प्रत्येक पंक्ति प्रकार के लिए: यह ट्रिगर | # प्रत्येक पंक्ति प्रकार के लिए: यह ट्रिगर सम्मिलित/अद्यतन/हटाए जाने से प्रभावित [[परिणाम सेट]] की प्रत्येक पंक्ति के लिए निष्पादित हो जाता है | ||
# प्रत्येक | # प्रत्येक कथन प्रकार के लिए: यह ट्रिगर सम्पूर्ण परिणाम सेट के लिए केवल निष्पादित होता है, किन्तु कथन के निष्पादित होने पर भी अग्नि प्रकट हो जाती है। | ||
==== | ==== प्रणाली स्तरीय ट्रिगर्स ==== | ||
[[Oracle8i]] से, डेटाबेस ईवेंट - लॉगऑन, लॉगऑफ़, स्टार्टअप - | (आकाशवाणी) [[Oracle8i]] से, डेटाबेस ईवेंट - लॉगऑन, लॉगऑफ़, स्टार्टअप - आकाशवाणी ट्रिगर्स को सक्रिय कर सकते हैं।<ref> | ||
{{cite book | {{cite book | ||
| last1 = Nanda | | last1 = Nanda | ||
Line 49: | Line 49: | ||
=== [[माइक्रोसॉफ्ट डॉक्स]] सर्वर === | === [[माइक्रोसॉफ्ट डॉक्स|माइक्रोसॉफ्ट एसक्यूएल]] सर्वर === | ||
डीडीएल ट्रिगर्स के लिए माइक्रोसॉफ्ट एसक्यूएल सर्वर में सभी उपलब्ध फायरिंग इवेंट्स की सूची माइक्रोसॉफ्ट एसक्यूएल पर उपलब्ध है।<ref>{{Cite web|url=https://docs.microsoft.com/en-us/sql/relational-databases/triggers/ddl-events?view=sql-server-ver15|title=DDL Events - SQL Server}}</ref>अस्थायी सम्मिलित और हटाए गए तालिकाओं तक पहुँचने के माध्यम से ट्रिगर्स (या संशोधन के पश्चात डेटा का परीक्षण) में नियमबद्ध क्रियाएं करना। | |||
अस्थायी सम्मिलित और हटाए गए तालिकाओं तक पहुँचने के माध्यम से ट्रिगर्स (या संशोधन के | |||
=== पोस्टग्रेएसक्यूएल === | === पोस्टग्रेएसक्यूएल === | ||
1997 में ट्रिगर्स के लिए समर्थन पेश किया गया। SQL:2003 में निम्नलिखित कार्यक्षमता | 1997 में ट्रिगर्स के लिए समर्थन पेश किया गया। SQL:2003 में निम्नलिखित कार्यक्षमता पूर्व PostgreSQL में लागू नहीं की गई थी: | ||
* एसक्यूएल ट्रिगर्स को विशिष्ट कॉलम के अपडेट पर आग लगाने की अनुमति देता है; PostgreSQL के संस्करण 9.0 के रूप में यह सुविधा PostgreSQL में भी लागू की गई है। | * एसक्यूएल ट्रिगर्स को विशिष्ट कॉलम के अपडेट पर आग लगाने की अनुमति देता है; PostgreSQL के संस्करण 9.0 के रूप में यह सुविधा PostgreSQL में भी लागू की गई है। | ||
* मानक सेलेक्ट (एसक्यूएल), इन्सर्ट (एसक्यूएल), [[अद्यतन (एसक्यूएल)]] के अलावा कई | * मानक सेलेक्ट (एसक्यूएल), इन्सर्ट (एसक्यूएल), [[अद्यतन (एसक्यूएल)]] के अलावा कई एसक्यूएलकथन्स के निष्पादन की अनुमति देता है, जैसे क्रिएट टेबल को ट्रिगर एक्शन के रूप में। यह क्रिएट टेबल को कॉल करने के लिए एक संग्रहीत कार्यविधि या फ़ंक्शन बनाकर किया जा सकता है।<ref>{{Cite web|url=https://www.postgresql.org/docs/9.0/sql-createtrigger.html|title=PostgreSQL: Documentation: 9.0: CREATE TRIGGER|website=www.postgresql.org|date=8 October 2015}}</ref> | ||
सार: | सार: | ||
<वाक्यविन्यास प्रकाश लैंग = पोस्टग्रेस्क्ल> | <वाक्यविन्यास प्रकाश लैंग = पोस्टग्रेस्क्ल> | ||
ट्रिगर नाम बनाएं { | ट्रिगर नाम बनाएं { पूर्व | पश्चात } { घटना [या ... ] } | ||
टेबल पर [[प्रत्येक] के लिए {पंक्ति | कथन } ] | टेबल पर [[प्रत्येक] के लिए {पंक्ति | कथन } ] | ||
निष्पादन प्रक्रिया funcname (तर्क) | निष्पादन प्रक्रिया funcname (तर्क) | ||
Line 67: | Line 66: | ||
=== फायरबर्ड === | === फायरबर्ड === | ||
फ़ायरबर्ड (डेटाबेस सर्वर) प्रति टेबल ट्रिगर्स से | फ़ायरबर्ड (डेटाबेस सर्वर) प्रति टेबल ट्रिगर्स से पूर्व या पश्चात में, INSERT, UPDATE, DELETE (या इसके किसी भी संयोजन) ट्रिगर्स के कई पंक्ति-स्तर का समर्थन करता है, जहां वे हमेशा डिफ़ॉल्ट तालिका परिवर्तनों के अतिरिक्त होते हैं, और ट्रिगर रिश्तेदार का क्रम एक दूसरे को निर्दिष्ट किया जा सकता है जहां यह अन्यथा अस्पष्ट होगा (POSITION क्लॉज।) ट्रिगर दृश्यों पर भी मौजूद हो सकते हैं, जहां वे हमेशा ट्रिगर के बजाय डिफ़ॉल्ट अद्यतन योग्य दृश्य तर्क को प्रतिस्थापित करते हैं। (संस्करण 2.1 से पूर्व, डिफ़ॉल्ट लॉजिक के साथ-साथ अपडेट किए जाने योग्य माने जाने वाले दृश्यों पर ट्रिगर चलेंगे।) | ||
फायरबर्ड म्यूटेटिंग टेबल अपवाद ( | फायरबर्ड म्यूटेटिंग टेबल अपवाद (आकाशवाणी की तरह) नहीं उठाता है, और ट्रिगर्स डिफ़ॉल्ट रूप से नेस्ट और रिकर्स दोनों की आवश्यकता होती है (एसक्यूएल सर्वर नेस्टिंग की अनुमति देता है, किन्तु डिफ़ॉल्ट रूप से रिकर्सन नहीं।) फायरबर्ड के ट्रिगर नए और पुराने संदर्भ चर का उपयोग करते हैं (सम्मिलित और हटाए गए टेबल नहीं) ,) और ट्रिगर के वर्तमान उपयोग को इंगित करने के लिए अपडेटिंग, इन्सर्टिंग और डिलीटिंग फ़्लैग प्रदान करें। | ||
<वाक्यविन्यास लैंग = एसक्यूएल> | <वाक्यविन्यास लैंग = एसक्यूएल> | ||
{बनाएं | मनोरंजन | CREATE OR ALTER} TRIGGER नाम के लिए {टेबल नाम | नाम देखें} | {बनाएं | मनोरंजन | CREATE OR ALTER} TRIGGER नाम के लिए {टेबल नाम | नाम देखें} | ||
[सक्रिय | निष्क्रिय] | [सक्रिय | निष्क्रिय] | ||
{ | {पूर्व | पश्चात में} | ||
{डालें [या अद्यतन करें] [या हटाएं] | अद्यतन [या सम्मिलित करें] [या हटाएं] | हटाएं [या अद्यतन] [या सम्मिलित करें]} | {डालें [या अद्यतन करें] [या हटाएं] | अद्यतन [या सम्मिलित करें] [या हटाएं] | हटाएं [या अद्यतन] [या सम्मिलित करें]} | ||
[स्थिति एन] ए.एस | [स्थिति एन] ए.एस | ||
Line 90: | Line 89: | ||
* लेनदेन रोलबैक | * लेनदेन रोलबैक | ||
डेटाबेस-स्तरीय ट्रिगर मल्टी-टेबल बाधाओं को लागू करने में मदद कर सकते हैं, या भौतिक विचारों का अनुकरण कर सकते हैं। यदि ट्रांज़ेक्शन कमिट ट्रिगर में एक अपवाद उठाया जाता है, तो ट्रिगर द्वारा अब तक किए गए परिवर्तन वापस ले लिए जाते हैं और क्लाइंट एप्लिकेशन को अधिसूचित किया जाता है, | डेटाबेस-स्तरीय ट्रिगर मल्टी-टेबल बाधाओं को लागू करने में मदद कर सकते हैं, या भौतिक विचारों का अनुकरण कर सकते हैं। यदि ट्रांज़ेक्शन कमिट ट्रिगर में एक अपवाद उठाया जाता है, तो ट्रिगर द्वारा अब तक किए गए परिवर्तन वापस ले लिए जाते हैं और क्लाइंट एप्लिकेशन को अधिसूचित किया जाता है, किन्तु लेनदेन सक्रिय रहता है जैसे कि COMMIT का कभी अनुरोध नहीं किया गया था; क्लाइंट एप्लिकेशन परिवर्तन करना जारी रख सकता है और COMMIT का पुनः अनुरोध कर सकता है। | ||
डेटाबेस ट्रिगर्स के लिए सिंटैक्स: | डेटाबेस ट्रिगर्स के लिए सिंटैक्स: | ||
Line 105: | Line 104: | ||
=== MySQL/MariaDB === | === MySQL/MariaDB === | ||
MySQL/MariaDB DBMS में ट्रिगर्स के लिए सीमित समर्थन MySQL के 5.0 संस्करण में जोड़ा गया था, जिसे 2005 में लॉन्च किया गया था।<ref>MySQL 5.0 Reference Manual. [https://downloads.mysql.com/docs/refman-5.0-en.pdf "Triggers. MySQL 5.0 added limited support for triggers"], ''[[Oracle Corporation]]'', Retrieved on 4 March 2020.</ref> संस्करण 8.0 के अनुसार, वे DDL (डेटा डेफिनिशन लैंग्वेज) ट्रिगर्स और DML (डेटा मैनीपुलेशन लैंग्वेज) ट्रिगर्स के लिए अनुमति देते हैं। वे ट्रिगर्स को परिभाषित करने के लिए किसी भी प्रकार के डीडीएल ट्रिगर (AFTER या BEFORE) का उपयोग करने की अनुमति देते हैं। वे क्लॉज क्रिएट ट्रिगर का उपयोग करके बनाए गए हैं और क्लॉज DROP TRIGGER का उपयोग करके हटा दिए गए हैं। किसी ईवेंट के घटित होने पर कहे जाने वाले कथन को प्रत्येक पंक्ति के लिए क्लॉज के | MySQL/MariaDB DBMS में ट्रिगर्स के लिए सीमित समर्थन MySQL के 5.0 संस्करण में जोड़ा गया था, जिसे 2005 में लॉन्च किया गया था।<ref>MySQL 5.0 Reference Manual. [https://downloads.mysql.com/docs/refman-5.0-en.pdf "Triggers. MySQL 5.0 added limited support for triggers"], ''[[Oracle Corporation]]'', Retrieved on 4 March 2020.</ref> संस्करण 8.0 के अनुसार, वे DDL (डेटा डेफिनिशन लैंग्वेज) ट्रिगर्स और DML (डेटा मैनीपुलेशन लैंग्वेज) ट्रिगर्स के लिए अनुमति देते हैं। वे ट्रिगर्स को परिभाषित करने के लिए किसी भी प्रकार के डीडीएल ट्रिगर (AFTER या BEFORE) का उपयोग करने की अनुमति देते हैं। वे क्लॉज क्रिएट ट्रिगर का उपयोग करके बनाए गए हैं और क्लॉज DROP TRIGGER का उपयोग करके हटा दिए गए हैं। किसी ईवेंट के घटित होने पर कहे जाने वाले कथन को प्रत्येक पंक्ति के लिए क्लॉज के पश्चात परिभाषित किया जाता है, उसके पश्चात एक कीवर्ड (SET या BEGIN) होता है, जो इंगित करता है कि क्या क्रमशः एक अभिव्यक्ति या एक कथन है।<ref>{{Cite web|url=https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html|title = MySQL :: MySQL 8.0 Reference Manual :: 25.3.1 Trigger Syntax and Examples}}</ref> | ||
=== आईबीएम DB2 LUW === | === आईबीएम DB2 LUW === | ||
LUW के लिए DB2 के रूप में ज्ञात वितरित सिस्टम के लिए IBM DB2 (LUW का अर्थ है Linux, Unix, Windows) तीन ट्रिगर प्रकारों का समर्थन करता है: ट्रिगर से | LUW के लिए DB2 के रूप में ज्ञात वितरित सिस्टम के लिए IBM DB2 (LUW का अर्थ है Linux, Unix, Windows) तीन ट्रिगर प्रकारों का समर्थन करता है: ट्रिगर से पूर्व, ट्रिगर के पश्चात और ट्रिगर के बजाय। कथन स्तर और पंक्ति स्तर ट्रिगर दोनों समर्थित हैं। यदि टेबल पर एक ही ऑपरेशन के लिए अधिक ट्रिगर हैं तो ट्रिगर निर्माण डेटा द्वारा फायरिंग ऑर्डर निर्धारित किया जाता है। चूंकि संस्करण 9.7 IBM DB2 [[स्वायत्त लेनदेन]] का समर्थन करता है।<ref>{{Cite web|url=http://www.ibm.com/developerworks/data/library/techarticle/dm-0907autonomoustransactions/index.html|title=Autonomous transactions|date=July 30, 2009|website=www.ibm.com}}</ref> | ||
ट्रिगर से | ट्रिगर से पूर्व डेटा की जाँच करने और यह तय करने के लिए है कि क्या ऑपरेशन की अनुमति दी जानी चाहिए। यदि ट्रिगर से पूर्व अपवाद फेंका जाता है तो ऑपरेशन निरस्त कर दिया जाता है और कोई डेटा नहीं बदला जाता है। DB2 में बिफोर ट्रिगर्स केवल पढ़ने के लिए होते हैं — आप बिफोर ट्रिगर्स में डेटा को संशोधित नहीं कर सकते हैं। ट्रिगर्स को पोस्ट प्रोसेसिंग के लिए डिज़ाइन किए जाने के पश्चात अनुरोध किए गए परिवर्तन के पश्चात किया गया था। ट्रिगर्स के पश्चात डेटा को टेबल में लिख सकते हैं और कुछ के विपरीत{{Which|date=June 2012}} अन्य डेटाबेस आप किसी भी तालिका में लिख सकते हैं जिसमें तालिका शामिल है जिस पर ट्रिगर संचालित होता है। ट्रिगर्स के बजाय विचारों को लिखने योग्य बनाने के लिए हैं। | ||
ट्रिगर आमतौर पर [[SQL PL]] भाषा में प्रोग्राम किए जाते हैं। | ट्रिगर आमतौर पर [[SQL PL]] भाषा में प्रोग्राम किए जाते हैं। | ||
Line 118: | Line 117: | ||
<वाक्यविन्यास लैंग = एसक्यूएल> | <वाक्यविन्यास लैंग = एसक्यूएल> | ||
बनाएँ [अस्थायी | अस्थायी] ट्रिगर [यदि मौजूद नहीं है] [डेटाबेस_नाम।] ट्रिगर_नाम | बनाएँ [अस्थायी | अस्थायी] ट्रिगर [यदि मौजूद नहीं है] [डेटाबेस_नाम।] ट्रिगर_नाम | ||
[ | [पूर्व | के पश्चात | के बजाय] {हटाएं | सम्मिलित करें | अद्यतन [स्तंभ_नाम [, स्तंभ_नाम]...]} | ||
{टेबल_नाम | पर view_name} | {टेबल_नाम | पर view_name} | ||
[प्रत्येक पंक्ति के लिए] [जब शर्त अनिवार्य हो] | [प्रत्येक पंक्ति के लिए] [जब शर्त अनिवार्य हो] | ||
Line 125: | Line 124: | ||
अंत </ सिंटैक्स हाइलाइट> | अंत </ सिंटैक्स हाइलाइट> | ||
SQLite केवल पंक्ति-स्तरीय ट्रिगर्स का समर्थन करता है, | SQLite केवल पंक्ति-स्तरीय ट्रिगर्स का समर्थन करता है,कथन-लेवल ट्रिगर्स का नहीं। | ||
[[अद्यतन करने योग्य दृश्य]], जो SQLite में समर्थित नहीं हैं, को INSTEAD OF ट्रिगर्स के साथ अनुकरण किया जा सकता है। | [[अद्यतन करने योग्य दृश्य]], जो SQLite में समर्थित नहीं हैं, को INSTEAD OF ट्रिगर्स के साथ अनुकरण किया जा सकता है। | ||
=== एक्सएमएल डेटाबेस === | === एक्सएमएल डेटाबेस === | ||
गैर-संबंधपरक डेटाबेस में ट्रिगर्स के कार्यान्वयन का एक उदाहरण [[बैठ गया (डेटाबेस)]] हो सकता है, जो [[XQuery]] पर आधारित ट्रिगर्स के लिए समर्थन प्रदान करता है। Sedna में ट्रिगर्स को SQL:2003 ट्रिगर्स के अनुरूप डिजाइन किया गया था, | गैर-संबंधपरक डेटाबेस में ट्रिगर्स के कार्यान्वयन का एक उदाहरण [[बैठ गया (डेटाबेस)]] हो सकता है, जो [[XQuery]] पर आधारित ट्रिगर्स के लिए समर्थन प्रदान करता है। Sedna में ट्रिगर्स को SQL:2003 ट्रिगर्स के अनुरूप डिजाइन किया गया था, किन्तु मूल रूप से XML क्वेरी और अपडेट लैंग्वेज ([[XPath]], XQuery और XML अपडेट लैंग्वेज) पर आधारित था। | ||
सेडना में एक ट्रिगर डेटाबेस में संग्रहीत XML दस्तावेज़ के किसी भी नोड पर सेट होता है। जब इन नोड्स को अपडेट किया जाता है, तो ट्रिगर स्वचालित रूप से XQuery प्रश्नों और उसके शरीर में निर्दिष्ट अपडेट को निष्पादित करता है। उदाहरण के लिए, यदि इस व्यक्ति द्वारा संदर्भित कोई खुली नीलामी होती है, तो निम्न ट्रिगर व्यक्ति नोड विलोपन को रद्द कर देता है: | सेडना में एक ट्रिगर डेटाबेस में संग्रहीत XML दस्तावेज़ के किसी भी नोड पर सेट होता है। जब इन नोड्स को अपडेट किया जाता है, तो ट्रिगर स्वचालित रूप से XQuery प्रश्नों और उसके शरीर में निर्दिष्ट अपडेट को निष्पादित करता है। उदाहरण के लिए, यदि इस व्यक्ति द्वारा संदर्भित कोई खुली नीलामी होती है, तो निम्न ट्रिगर व्यक्ति नोड विलोपन को रद्द कर देता है: | ||
<वाक्यविन्यास लैंग = xql> | <वाक्यविन्यास लैंग = xql> | ||
ट्रिगर ट्रिगर बनाएं3 | ट्रिगर ट्रिगर बनाएं3 | ||
हटाने से | हटाने से पूर्व | ||
ऑन डॉक (नीलामी)/साइट//व्यक्ति | ऑन डॉक (नीलामी)/साइट//व्यक्ति | ||
प्रत्येक नोड के लिए | प्रत्येक नोड के लिए | ||
Line 147: | Line 146: | ||
== पंक्ति और कथन स्तर ट्रिगर == | == पंक्ति और कथन स्तर ट्रिगर == | ||
यह समझने के लिए कि ट्रिगर व्यवहार कैसे काम करता है, आपको दो मुख्य प्रकार के ट्रिगर्स के बारे में पता होना चाहिए; ये रो | यह समझने के लिए कि ट्रिगर व्यवहार कैसे काम करता है, आपको दो मुख्य प्रकार के ट्रिगर्स के बारे में पता होना चाहिए; ये रो औरकथन लेवल ट्रिगर हैं। दोनों के बीच का अंतर यह है कि ट्रिगर के भीतर कोड को कितनी बार और किस समय निष्पादित किया जाता है। | ||
मान लीजिए कि आपके पास एक ट्रिगर है जिसे किसी निश्चित तालिका में अद्यतन पर कॉल करने के लिए बनाया गया है। अद्यतन से प्रभावित होने वाली प्रत्येक पंक्ति के लिए पंक्ति स्तर ट्रिगर एक बार निष्पादित होंगे। यह ध्यान रखना महत्वपूर्ण है कि यदि UPDATE कमांड से कोई पंक्ति प्रभावित नहीं होती है, तो ट्रिगर ट्रिगर के भीतर किसी भी कोड को निष्पादित नहीं करेगा। UPDATE से कितनी पंक्तियाँ प्रभावित हैं, इस पर ध्यान दिए | मान लीजिए कि आपके पास एक ट्रिगर है जिसे किसी निश्चित तालिका में अद्यतन पर कॉल करने के लिए बनाया गया है। अद्यतन से प्रभावित होने वाली प्रत्येक पंक्ति के लिए पंक्ति स्तर ट्रिगर एक बार निष्पादित होंगे। यह ध्यान रखना महत्वपूर्ण है कि यदि UPDATE कमांड से कोई पंक्ति प्रभावित नहीं होती है, तो ट्रिगर ट्रिगर के भीतर किसी भी कोड को निष्पादित नहीं करेगा। UPDATE से कितनी पंक्तियाँ प्रभावित हैं, इस पर ध्यान दिए बिनाकथन लेवल ट्रिगर्स को एक बार कॉल किया जाएगा। यहां यह ध्यान रखना महत्वपूर्ण है कि भले ही UPDATE कमांड किसी भी पंक्ति को प्रभावित न करे, फिर भी ट्रिगर के भीतर कोड को एक बार निष्पादित किया जाएगा। | ||
पूर्व और पश्चात के विकल्पों का उपयोग करना<ref>{{Cite web|url=https://docs.oracle.com/cd/B25329_01/doc/appdev.102/b25108/xedev_triggers.htm|title=6 Using Triggers|website=docs.oracle.com}}</ref> निर्धारित करें कि ट्रिगर कब कहा जाता है। मान लीजिए कि आपके पास एक ट्रिगर है जिसे INSERT पर एक निश्चित तालिका में कहा जाता है। यदि आपका ट्रिगर पूर्व विकल्प का उपयोग कर रहा है, तो तालिका में INSERT होने से पूर्व ट्रिगर के भीतर कोड निष्पादित किया जाएगा। पूर्व ट्रिगर का एक सामान्य उपयोग INSERT के इनपुट मानों को सत्यापित करना है, या तदनुसार मानों को संशोधित करना है। अब मान लें कि हमारे पास एक ट्रिगर है जो इसके बजाय AFTER का उपयोग करता है। तालिका में INSERT होने के पश्चात ट्रिगर के भीतर कोड निष्पादित किया जाता है। इस ट्रिगर का एक उदाहरण उपयोग किए गए परिवर्तनों का ट्रैक रखते हुए, डेटाबेस में किसने प्रविष्टियां की हैं, इसका लेखापरीक्षा इतिहास बना रहा है। इन विकल्पों का उपयोग करते समय आपको कुछ बातों का ध्यान रखना होगा। पूर्व विकल्प आपको तालिकाओं को संशोधित करने की अनुमति नहीं देता है, यही कारण है कि इनपुट सत्यापन एक व्यावहारिक उपयोग है। ट्रिगर्स के पश्चात का उपयोग करने से आप ऑडिट इतिहास तालिका में डालने जैसी तालिकाओं को संशोधित कर सकते हैं। | |||
यह निर्धारित करने के लिए ट्रिगर बनाते समय कि क्या यह कथन या पंक्ति स्तर है, केवल पंक्ति स्तर के लिए प्रत्येक पंक्ति के लिए खंड शामिल करें, या कथन स्तर के लिए खंड को छोड़ दें। अपने ट्रिगर के भीतर अतिरिक्त इन्सर्ट (एसक्यूएल)/अपडेट (एसक्यूएल)/[[हटाएं (एसक्यूएल)]] कमांड का उपयोग करने से सावधान रहें, क्योंकि ट्रिगर रिकर्सन (कंप्यूटर साइंस) संभव है, जिससे अवांछित व्यवहार होता है। नीचे दिए गए उदाहरणों में प्रत्येक ट्रिगर एक अलग तालिका को संशोधित कर रहा है, जो संशोधित किया जा रहा है उसे देखकर आप कुछ सामान्य अनुप्रयोगों को देख सकते हैं जब विभिन्न ट्रिगर प्रकारों का उपयोग किया जाता है। | यह निर्धारित करने के लिए ट्रिगर बनाते समय कि क्या यह कथन या पंक्ति स्तर है, केवल पंक्ति स्तर के लिए प्रत्येक पंक्ति के लिए खंड शामिल करें, या कथन स्तर के लिए खंड को छोड़ दें। अपने ट्रिगर के भीतर अतिरिक्त इन्सर्ट (एसक्यूएल)/अपडेट (एसक्यूएल)/[[हटाएं (एसक्यूएल)]] कमांड का उपयोग करने से सावधान रहें, क्योंकि ट्रिगर रिकर्सन (कंप्यूटर साइंस) संभव है, जिससे अवांछित व्यवहार होता है। नीचे दिए गए उदाहरणों में प्रत्येक ट्रिगर एक अलग तालिका को संशोधित कर रहा है, जो संशोधित किया जा रहा है उसे देखकर आप कुछ सामान्य अनुप्रयोगों को देख सकते हैं जब विभिन्न ट्रिगर प्रकारों का उपयोग किया जाता है। | ||
निम्नलिखित एक पंक्ति स्तर ट्रिगर का Oracle सिंटैक्स उदाहरण है जिसे प्रभावित प्रत्येक पंक्ति के लिए अद्यतन के | निम्नलिखित एक पंक्ति स्तर ट्रिगर का Oracle सिंटैक्स उदाहरण है जिसे प्रभावित प्रत्येक पंक्ति के लिए अद्यतन के पश्चात कहा जाता है। इस ट्रिगर को फोन बुक डेटाबेस के अपडेट पर कॉल किया जाता है। जब ट्रिगर को कॉल किया जाता है तो यह phone_book_audit नाम की एक अलग तालिका में एक प्रविष्टि जोड़ता है। स्कीमा ऑब्जेक्ट्स जैसे अनुक्रमों का लाभ उठाने में सक्षम होने वाले ट्रिगर्स पर भी ध्यान दें,<ref>{{Cite web|url=http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6014.htm|archive-url=https://web.archive.org/web/20111201225844/http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6014.htm|url-status=live|archive-date=2011-12-01|title=Oracle's Documentation on Sequences}}</ref> इस उदाहरण में audio_id_sequence.nexVal का उपयोग phone_book_audit तालिका में अद्वितीय [[प्राथमिक कुंजी]] उत्पन्न करने के लिए किया जाता है। | ||
<वाक्यविन्यास प्रकाश लैंग = oracle11> | <वाक्यविन्यास प्रकाश लैंग = oracle11> | ||
ट्रिगर फोन_बुक_ऑडिट बनाएं या बदलें | ट्रिगर फोन_बुक_ऑडिट बनाएं या बदलें | ||
प्रत्येक पंक्ति के लिए फोनबुक पर अद्यतन के | प्रत्येक पंक्ति के लिए फोनबुक पर अद्यतन के पश्चात | ||
शुरू | शुरू | ||
फोन_बुक_ऑडिट में प्रवेश करें | फोन_बुक_ऑडिट में प्रवेश करें | ||
Line 181: | Line 180: | ||
| 2 || Update || Megan || Jones || 111-111-1111 || 111-222-3456 || 02-MAY-14 | | 2 || Update || Megan || Jones || 111-111-1111 || 111-222-3456 || 02-MAY-14 | ||
|} | |} | ||
ध्यान दें कि phone_number_audit तालिका अब दो प्रविष्टियों से | ध्यान दें कि phone_number_audit तालिका अब दो प्रविष्टियों से आपश्चात है। यह डेटाबेस के साथ दो प्रविष्टियों वाले होने के कारण है | ||
'जोन्स' का अंतिम नाम। चूंकि अपडेट दो अलग-अलग पंक्ति मानों को संशोधित करता है, इसलिए बनाए गए ट्रिगर को दो बार कॉल किया गया था; एक बार प्रत्येक संशोधन के | 'जोन्स' का अंतिम नाम। चूंकि अपडेट दो अलग-अलग पंक्ति मानों को संशोधित करता है, इसलिए बनाए गए ट्रिगर को दो बार कॉल किया गया था; एक बार प्रत्येक संशोधन के पश्चात। | ||
=== आफ्टर - | === आफ्टर -कथन-लेवल ट्रिगर === | ||
एक Oracle | एक Oracle सिंटैक्सकथन ट्रिगर जिसे फोन_बुक तालिका में अद्यतन के पश्चात कहा जाता है। जब ट्रिगर को कॉल किया जाता है तो यह phone_book_edit_history तालिका में सम्मिलित करता है | ||
<वाक्यविन्यास प्रकाश लैंग = oracle11> | <वाक्यविन्यास प्रकाश लैंग = oracle11> | ||
ट्रिगर फोन_बुक_इतिहास बनाएं या बदलें | ट्रिगर फोन_बुक_इतिहास बनाएं या बदलें | ||
फोन_बुक पर अद्यतन के | फोन_बुक पर अद्यतन के पश्चात | ||
शुरू | शुरू | ||
फोन_बुक_एडिट_इतिहास में प्रवेश करें | फोन_बुक_एडिट_इतिहास में प्रवेश करें | ||
Line 197: | Line 196: | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट> | ||
अब उपरोक्त उदाहरण के समान ही अपडेट कर रहे हैं, हालांकि इस | अब उपरोक्त उदाहरण के समान ही अपडेट कर रहे हैं, हालांकि इस बारकथन लेवल ट्रिगर के साथ। <वाक्यविन्यास प्रकाश लैंग = oracle11> | ||
अद्यतन फोन_बुक सेट फोन_नंबर = '111-111-1111' जहां अंतिम_नाम = 'जोन्स'; | अद्यतन फोन_बुक सेट फोन_नंबर = '111-111-1111' जहां अंतिम_नाम = 'जोन्स'; | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट> | ||
Line 209: | Line 208: | ||
नतीजा दिखाता है कि ट्रिगर को केवल एक बार बुलाया गया था, भले ही अपडेट ने दो पंक्तियों को बदल दिया हो। | नतीजा दिखाता है कि ट्रिगर को केवल एक बार बुलाया गया था, भले ही अपडेट ने दो पंक्तियों को बदल दिया हो। | ||
=== प्रत्येक से | === प्रत्येक से पूर्व - पंक्ति-स्तर ट्रिगर === | ||
यह उदाहरण प्रत्येक पंक्ति ट्रिगर से | यह उदाहरण प्रत्येक पंक्ति ट्रिगर से पूर्व प्रदर्शित करता है जो WHEN सशर्त का उपयोग करके INSERT को संशोधित करता है। यदि अंतिम नाम SUBSTR फ़ंक्शन का उपयोग करके 10 अक्षरों से बड़ा है<ref>{{Cite web|url=https://www.databasestar.com/oracle-sql-functions/|title=Oracle SQL Functions – The Complete List|date=December 26, 2014}}</ref> हम last_name कॉलम मान को संक्षेप में बदलते हैं। | ||
<वाक्यविन्यास प्रकाश लैंग = oracle11> | <वाक्यविन्यास प्रकाश लैंग = oracle11> | ||
TRIGGER phone_book_insert बनाएं या बदलें | TRIGGER phone_book_insert बनाएं या बदलें | ||
प्रत्येक पंक्ति के लिए फोन_बुक पर डालने से | प्रत्येक पंक्ति के लिए फोन_बुक पर डालने से पूर्व | ||
WHEN (LENGTH(new.last_name) > 10) | WHEN (LENGTH(new.last_name) > 10) | ||
शुरू | शुरू | ||
Line 233: | Line 232: | ||
| 6 || V || Erin || Minneapolis || MN || 989 University Drive || 123-222-4456 || 55408 || 21-NOV-91 | | 6 || V || Erin || Minneapolis || MN || 989 University Drive || 123-222-4456 || 55408 || 21-NOV-91 | ||
|} | |} | ||
ट्रिगर ने उपरोक्त परिणाम के अनुसार काम किया, INSERT के मान को निष्पादित करने से | ट्रिगर ने उपरोक्त परिणाम के अनुसार काम किया, INSERT के मान को निष्पादित करने से पूर्व संशोधित किया। | ||
=== | === पूर्व -कथन-लेवल ट्रिगर === | ||
डेटाबेस प्रतिबंधों को लागू करते समय | डेटाबेस प्रतिबंधों को लागू करते समय BEFOREकथन ट्रिगर का उपयोग करना विशेष रूप से उपयोगी होता है।<ref>{{Cite web|url=https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_trigger.htm|title=Database PL/SQL Language Reference|website=docs.oracle.com}}</ref> यह उदाहरण प्रदर्शित करता है कि तालिका phone_book पर SOMEUSER नाम के किसी व्यक्ति पर प्रतिबंध कैसे लागू किया जाए। | ||
<वाक्यविन्यास प्रकाश लैंग = oracle11> | <वाक्यविन्यास प्रकाश लैंग = oracle11> | ||
ट्रिगर हॉशबीसी बनाएं या बदलें | ट्रिगर हॉशबीसी बनाएं या बदलें | ||
SOMEUSER.phone_book पर डालने से | SOMEUSER.phone_book पर डालने से पूर्व | ||
शुरू | शुरू | ||
RAISE_APPLICATION_ERROR ( | RAISE_APPLICATION_ERROR ( | ||
Line 248: | Line 247: | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट> | ||
अब, जब किसी INSERT का प्रयास करने के | अब, जब किसी INSERT का प्रयास करने के पश्चात SOMEUSER लॉग इन होता है तो यह त्रुटि संदेश दिखाई देगा: | ||
SQL त्रुटि: ORA-20050: त्रुटि संदेश यहाँ जाता है। | SQL त्रुटि: ORA-20050: त्रुटि संदेश यहाँ जाता है। |
Revision as of 11:34, 23 February 2023
डेटाबेस ट्रिगर प्रक्रियात्मक कोड है जो किसी विशेष तालिका (डेटाबेस) या डेटाबेस में देखने (डेटाबेस) पर कुछ ईवेंट (कंप्यूटिंग) के उत्तर में स्वचालित रूप से निष्पादित होता है। ट्रिगर का उपयोग अधिकतम डेटाबेस पर जानकारी की डेटाबेस अखंडता को बनाए रखने के लिए किया जाता है। उदाहरण के लिए, जब कर्मचारियों की तालिका में नया रिकॉर्ड (नए कार्यकर्ता का प्रतिनिधित्व) सम्मिलित किया जाता है, तो करों, अवकाश और वेतन की तालिकाओं में भी नए रिकॉर्ड बनाए जाने चाहिए। ट्रिगर का उपयोग ऐतिहासिक डेटा लॉग करने के लिए भी किया जा सकता है, उदाहरण के लिए कर्मचारियों के पूर्व वेतन पर दृष्टि रखने के लिए किया जाता है।
डीबीएमएस में ट्रिगर
नीचे कुछ लोकप्रिय डीबीएमएस समर्थन ट्रिगर्स के विवरण की श्रृंखला दी गई है।
आकाशवाणी
डेटा संशोधित होने पर उस आग (और पीएल/एसक्यूएल कोड को निष्पादित) ट्रिगर करने के अतिरिक्त, आकाशवाणी डाटाबेस उस ट्रिगर का समर्थन करता है जब स्कीमा-स्तरीय ऑब्जेक्ट्स (अर्थात, टेबल) संशोधित होते हैं और जब उपयोगकर्ता लॉगऑन या लॉगऑफ घटनाएं होती हैं।
स्कीमा-लेवल ट्रिगर्स
- सृष्टि के पश्चात
- ऑल्टर से पूर्व
- आल्टर के पश्चात
- गिरने से पूर्व
- गिरने के पश्चात
- चिह्नित से पूर्व
चार मुख्य प्रकार के ट्रिगर हैं:
- रो-लेवल ट्रिगर: यह किसी पंक्ति परिवर्तन के किसी भी कॉलम मान से पूर्व या पश्चात में निष्पादित हो जाता है
- कॉलम-स्तरीय ट्रिगर: निर्दिष्ट कॉलम परिवर्तन से पूर्व या पश्चात में इसे निष्पादित किया जाता है
- प्रत्येक पंक्ति प्रकार के लिए: यह ट्रिगर सम्मिलित/अद्यतन/हटाए जाने से प्रभावित परिणाम सेट की प्रत्येक पंक्ति के लिए निष्पादित हो जाता है
- प्रत्येक कथन प्रकार के लिए: यह ट्रिगर सम्पूर्ण परिणाम सेट के लिए केवल निष्पादित होता है, किन्तु कथन के निष्पादित होने पर भी अग्नि प्रकट हो जाती है।
प्रणाली स्तरीय ट्रिगर्स
(आकाशवाणी) Oracle8i से, डेटाबेस ईवेंट - लॉगऑन, लॉगऑफ़, स्टार्टअप - आकाशवाणी ट्रिगर्स को सक्रिय कर सकते हैं।[1]
माइक्रोसॉफ्ट एसक्यूएल सर्वर
डीडीएल ट्रिगर्स के लिए माइक्रोसॉफ्ट एसक्यूएल सर्वर में सभी उपलब्ध फायरिंग इवेंट्स की सूची माइक्रोसॉफ्ट एसक्यूएल पर उपलब्ध है।[2]अस्थायी सम्मिलित और हटाए गए तालिकाओं तक पहुँचने के माध्यम से ट्रिगर्स (या संशोधन के पश्चात डेटा का परीक्षण) में नियमबद्ध क्रियाएं करना।
पोस्टग्रेएसक्यूएल
1997 में ट्रिगर्स के लिए समर्थन पेश किया गया। SQL:2003 में निम्नलिखित कार्यक्षमता पूर्व PostgreSQL में लागू नहीं की गई थी:
- एसक्यूएल ट्रिगर्स को विशिष्ट कॉलम के अपडेट पर आग लगाने की अनुमति देता है; PostgreSQL के संस्करण 9.0 के रूप में यह सुविधा PostgreSQL में भी लागू की गई है।
- मानक सेलेक्ट (एसक्यूएल), इन्सर्ट (एसक्यूएल), अद्यतन (एसक्यूएल) के अलावा कई एसक्यूएलकथन्स के निष्पादन की अनुमति देता है, जैसे क्रिएट टेबल को ट्रिगर एक्शन के रूप में। यह क्रिएट टेबल को कॉल करने के लिए एक संग्रहीत कार्यविधि या फ़ंक्शन बनाकर किया जा सकता है।[3]
सार:
<वाक्यविन्यास प्रकाश लैंग = पोस्टग्रेस्क्ल> ट्रिगर नाम बनाएं { पूर्व | पश्चात } { घटना [या ... ] }
टेबल पर [[प्रत्येक] के लिए {पंक्ति | कथन } ] निष्पादन प्रक्रिया funcname (तर्क)
</वाक्यविन्यास हाइलाइट>
फायरबर्ड
फ़ायरबर्ड (डेटाबेस सर्वर) प्रति टेबल ट्रिगर्स से पूर्व या पश्चात में, INSERT, UPDATE, DELETE (या इसके किसी भी संयोजन) ट्रिगर्स के कई पंक्ति-स्तर का समर्थन करता है, जहां वे हमेशा डिफ़ॉल्ट तालिका परिवर्तनों के अतिरिक्त होते हैं, और ट्रिगर रिश्तेदार का क्रम एक दूसरे को निर्दिष्ट किया जा सकता है जहां यह अन्यथा अस्पष्ट होगा (POSITION क्लॉज।) ट्रिगर दृश्यों पर भी मौजूद हो सकते हैं, जहां वे हमेशा ट्रिगर के बजाय डिफ़ॉल्ट अद्यतन योग्य दृश्य तर्क को प्रतिस्थापित करते हैं। (संस्करण 2.1 से पूर्व, डिफ़ॉल्ट लॉजिक के साथ-साथ अपडेट किए जाने योग्य माने जाने वाले दृश्यों पर ट्रिगर चलेंगे।)
फायरबर्ड म्यूटेटिंग टेबल अपवाद (आकाशवाणी की तरह) नहीं उठाता है, और ट्रिगर्स डिफ़ॉल्ट रूप से नेस्ट और रिकर्स दोनों की आवश्यकता होती है (एसक्यूएल सर्वर नेस्टिंग की अनुमति देता है, किन्तु डिफ़ॉल्ट रूप से रिकर्सन नहीं।) फायरबर्ड के ट्रिगर नए और पुराने संदर्भ चर का उपयोग करते हैं (सम्मिलित और हटाए गए टेबल नहीं) ,) और ट्रिगर के वर्तमान उपयोग को इंगित करने के लिए अपडेटिंग, इन्सर्टिंग और डिलीटिंग फ़्लैग प्रदान करें।
<वाक्यविन्यास लैंग = एसक्यूएल> {बनाएं | मनोरंजन | CREATE OR ALTER} TRIGGER नाम के लिए {टेबल नाम | नाम देखें}
[सक्रिय | निष्क्रिय] {पूर्व | पश्चात में} {डालें [या अद्यतन करें] [या हटाएं] | अद्यतन [या सम्मिलित करें] [या हटाएं] | हटाएं [या अद्यतन] [या सम्मिलित करें]} [स्थिति एन] ए.एस
शुरू
....
अंत </वाक्यविन्यास हाइलाइट>
संस्करण 2.1 के अनुसार, फायरबर्ड अतिरिक्त रूप से निम्नलिखित डेटाबेस-स्तरीय ट्रिगर्स का समर्थन करता है:
- कनेक्ट करें (यहां उठाए गए अपवाद कनेक्शन को पूरा होने से रोकते हैं)
- डिस्कनेक्ट करें
- लेन-देन प्रारंभ
- ट्रांज़ैक्शन कमिट (यहाँ उठाए गए अपवाद लेनदेन को कमिट करने से रोकते हैं, या दो-चरण की कमिटमेंट शामिल होने पर तैयारी करते हैं)
- लेनदेन रोलबैक
डेटाबेस-स्तरीय ट्रिगर मल्टी-टेबल बाधाओं को लागू करने में मदद कर सकते हैं, या भौतिक विचारों का अनुकरण कर सकते हैं। यदि ट्रांज़ेक्शन कमिट ट्रिगर में एक अपवाद उठाया जाता है, तो ट्रिगर द्वारा अब तक किए गए परिवर्तन वापस ले लिए जाते हैं और क्लाइंट एप्लिकेशन को अधिसूचित किया जाता है, किन्तु लेनदेन सक्रिय रहता है जैसे कि COMMIT का कभी अनुरोध नहीं किया गया था; क्लाइंट एप्लिकेशन परिवर्तन करना जारी रख सकता है और COMMIT का पुनः अनुरोध कर सकता है।
डेटाबेस ट्रिगर्स के लिए सिंटैक्स:
<वाक्यविन्यास लैंग = एसक्यूएल> {बनाएं | मनोरंजन | CREATE OR ALTER} ट्रिगर नाम
[सक्रिय | निष्क्रिय] पर {कनेक्ट | डिस्कनेक्ट | लेन-देन प्रारंभ | लेन-देन कमिट | लेन-देन रोलबैक} [स्थिति एन] ए.एस
शुरू
.....
अंत </वाक्यविन्यास हाइलाइट>
MySQL/MariaDB
MySQL/MariaDB DBMS में ट्रिगर्स के लिए सीमित समर्थन MySQL के 5.0 संस्करण में जोड़ा गया था, जिसे 2005 में लॉन्च किया गया था।[4] संस्करण 8.0 के अनुसार, वे DDL (डेटा डेफिनिशन लैंग्वेज) ट्रिगर्स और DML (डेटा मैनीपुलेशन लैंग्वेज) ट्रिगर्स के लिए अनुमति देते हैं। वे ट्रिगर्स को परिभाषित करने के लिए किसी भी प्रकार के डीडीएल ट्रिगर (AFTER या BEFORE) का उपयोग करने की अनुमति देते हैं। वे क्लॉज क्रिएट ट्रिगर का उपयोग करके बनाए गए हैं और क्लॉज DROP TRIGGER का उपयोग करके हटा दिए गए हैं। किसी ईवेंट के घटित होने पर कहे जाने वाले कथन को प्रत्येक पंक्ति के लिए क्लॉज के पश्चात परिभाषित किया जाता है, उसके पश्चात एक कीवर्ड (SET या BEGIN) होता है, जो इंगित करता है कि क्या क्रमशः एक अभिव्यक्ति या एक कथन है।[5]
आईबीएम DB2 LUW
LUW के लिए DB2 के रूप में ज्ञात वितरित सिस्टम के लिए IBM DB2 (LUW का अर्थ है Linux, Unix, Windows) तीन ट्रिगर प्रकारों का समर्थन करता है: ट्रिगर से पूर्व, ट्रिगर के पश्चात और ट्रिगर के बजाय। कथन स्तर और पंक्ति स्तर ट्रिगर दोनों समर्थित हैं। यदि टेबल पर एक ही ऑपरेशन के लिए अधिक ट्रिगर हैं तो ट्रिगर निर्माण डेटा द्वारा फायरिंग ऑर्डर निर्धारित किया जाता है। चूंकि संस्करण 9.7 IBM DB2 स्वायत्त लेनदेन का समर्थन करता है।[6] ट्रिगर से पूर्व डेटा की जाँच करने और यह तय करने के लिए है कि क्या ऑपरेशन की अनुमति दी जानी चाहिए। यदि ट्रिगर से पूर्व अपवाद फेंका जाता है तो ऑपरेशन निरस्त कर दिया जाता है और कोई डेटा नहीं बदला जाता है। DB2 में बिफोर ट्रिगर्स केवल पढ़ने के लिए होते हैं — आप बिफोर ट्रिगर्स में डेटा को संशोधित नहीं कर सकते हैं। ट्रिगर्स को पोस्ट प्रोसेसिंग के लिए डिज़ाइन किए जाने के पश्चात अनुरोध किए गए परिवर्तन के पश्चात किया गया था। ट्रिगर्स के पश्चात डेटा को टेबल में लिख सकते हैं और कुछ के विपरीत[which?] अन्य डेटाबेस आप किसी भी तालिका में लिख सकते हैं जिसमें तालिका शामिल है जिस पर ट्रिगर संचालित होता है। ट्रिगर्स के बजाय विचारों को लिखने योग्य बनाने के लिए हैं।
ट्रिगर आमतौर पर SQL PL भाषा में प्रोग्राम किए जाते हैं।
SQLite
<वाक्यविन्यास लैंग = एसक्यूएल> बनाएँ [अस्थायी | अस्थायी] ट्रिगर [यदि मौजूद नहीं है] [डेटाबेस_नाम।] ट्रिगर_नाम [पूर्व | के पश्चात | के बजाय] {हटाएं | सम्मिलित करें | अद्यतन [स्तंभ_नाम [, स्तंभ_नाम]...]} {टेबल_नाम | पर view_name}
[प्रत्येक पंक्ति के लिए] [जब शर्त अनिवार्य हो]
शुरू
...
अंत </ सिंटैक्स हाइलाइट>
SQLite केवल पंक्ति-स्तरीय ट्रिगर्स का समर्थन करता है,कथन-लेवल ट्रिगर्स का नहीं।
अद्यतन करने योग्य दृश्य, जो SQLite में समर्थित नहीं हैं, को INSTEAD OF ट्रिगर्स के साथ अनुकरण किया जा सकता है।
एक्सएमएल डेटाबेस
गैर-संबंधपरक डेटाबेस में ट्रिगर्स के कार्यान्वयन का एक उदाहरण बैठ गया (डेटाबेस) हो सकता है, जो XQuery पर आधारित ट्रिगर्स के लिए समर्थन प्रदान करता है। Sedna में ट्रिगर्स को SQL:2003 ट्रिगर्स के अनुरूप डिजाइन किया गया था, किन्तु मूल रूप से XML क्वेरी और अपडेट लैंग्वेज (XPath, XQuery और XML अपडेट लैंग्वेज) पर आधारित था।
सेडना में एक ट्रिगर डेटाबेस में संग्रहीत XML दस्तावेज़ के किसी भी नोड पर सेट होता है। जब इन नोड्स को अपडेट किया जाता है, तो ट्रिगर स्वचालित रूप से XQuery प्रश्नों और उसके शरीर में निर्दिष्ट अपडेट को निष्पादित करता है। उदाहरण के लिए, यदि इस व्यक्ति द्वारा संदर्भित कोई खुली नीलामी होती है, तो निम्न ट्रिगर व्यक्ति नोड विलोपन को रद्द कर देता है: <वाक्यविन्यास लैंग = xql> ट्रिगर ट्रिगर बनाएं3
हटाने से पूर्व ऑन डॉक (नीलामी)/साइट//व्यक्ति प्रत्येक नोड के लिए करना { अगर (मौजूद है ($ WHERE // open_auction / बोली लगाने वाला / व्यक्ति रेफरी / @ व्यक्ति = $ पुराना / @ आईडी)) तब ( ) वरना $पुराना; }
</वाक्यविन्यास हाइलाइट>
पंक्ति और कथन स्तर ट्रिगर
यह समझने के लिए कि ट्रिगर व्यवहार कैसे काम करता है, आपको दो मुख्य प्रकार के ट्रिगर्स के बारे में पता होना चाहिए; ये रो औरकथन लेवल ट्रिगर हैं। दोनों के बीच का अंतर यह है कि ट्रिगर के भीतर कोड को कितनी बार और किस समय निष्पादित किया जाता है।
मान लीजिए कि आपके पास एक ट्रिगर है जिसे किसी निश्चित तालिका में अद्यतन पर कॉल करने के लिए बनाया गया है। अद्यतन से प्रभावित होने वाली प्रत्येक पंक्ति के लिए पंक्ति स्तर ट्रिगर एक बार निष्पादित होंगे। यह ध्यान रखना महत्वपूर्ण है कि यदि UPDATE कमांड से कोई पंक्ति प्रभावित नहीं होती है, तो ट्रिगर ट्रिगर के भीतर किसी भी कोड को निष्पादित नहीं करेगा। UPDATE से कितनी पंक्तियाँ प्रभावित हैं, इस पर ध्यान दिए बिनाकथन लेवल ट्रिगर्स को एक बार कॉल किया जाएगा। यहां यह ध्यान रखना महत्वपूर्ण है कि भले ही UPDATE कमांड किसी भी पंक्ति को प्रभावित न करे, फिर भी ट्रिगर के भीतर कोड को एक बार निष्पादित किया जाएगा।
पूर्व और पश्चात के विकल्पों का उपयोग करना[7] निर्धारित करें कि ट्रिगर कब कहा जाता है। मान लीजिए कि आपके पास एक ट्रिगर है जिसे INSERT पर एक निश्चित तालिका में कहा जाता है। यदि आपका ट्रिगर पूर्व विकल्प का उपयोग कर रहा है, तो तालिका में INSERT होने से पूर्व ट्रिगर के भीतर कोड निष्पादित किया जाएगा। पूर्व ट्रिगर का एक सामान्य उपयोग INSERT के इनपुट मानों को सत्यापित करना है, या तदनुसार मानों को संशोधित करना है। अब मान लें कि हमारे पास एक ट्रिगर है जो इसके बजाय AFTER का उपयोग करता है। तालिका में INSERT होने के पश्चात ट्रिगर के भीतर कोड निष्पादित किया जाता है। इस ट्रिगर का एक उदाहरण उपयोग किए गए परिवर्तनों का ट्रैक रखते हुए, डेटाबेस में किसने प्रविष्टियां की हैं, इसका लेखापरीक्षा इतिहास बना रहा है। इन विकल्पों का उपयोग करते समय आपको कुछ बातों का ध्यान रखना होगा। पूर्व विकल्प आपको तालिकाओं को संशोधित करने की अनुमति नहीं देता है, यही कारण है कि इनपुट सत्यापन एक व्यावहारिक उपयोग है। ट्रिगर्स के पश्चात का उपयोग करने से आप ऑडिट इतिहास तालिका में डालने जैसी तालिकाओं को संशोधित कर सकते हैं।
यह निर्धारित करने के लिए ट्रिगर बनाते समय कि क्या यह कथन या पंक्ति स्तर है, केवल पंक्ति स्तर के लिए प्रत्येक पंक्ति के लिए खंड शामिल करें, या कथन स्तर के लिए खंड को छोड़ दें। अपने ट्रिगर के भीतर अतिरिक्त इन्सर्ट (एसक्यूएल)/अपडेट (एसक्यूएल)/हटाएं (एसक्यूएल) कमांड का उपयोग करने से सावधान रहें, क्योंकि ट्रिगर रिकर्सन (कंप्यूटर साइंस) संभव है, जिससे अवांछित व्यवहार होता है। नीचे दिए गए उदाहरणों में प्रत्येक ट्रिगर एक अलग तालिका को संशोधित कर रहा है, जो संशोधित किया जा रहा है उसे देखकर आप कुछ सामान्य अनुप्रयोगों को देख सकते हैं जब विभिन्न ट्रिगर प्रकारों का उपयोग किया जाता है।
निम्नलिखित एक पंक्ति स्तर ट्रिगर का Oracle सिंटैक्स उदाहरण है जिसे प्रभावित प्रत्येक पंक्ति के लिए अद्यतन के पश्चात कहा जाता है। इस ट्रिगर को फोन बुक डेटाबेस के अपडेट पर कॉल किया जाता है। जब ट्रिगर को कॉल किया जाता है तो यह phone_book_audit नाम की एक अलग तालिका में एक प्रविष्टि जोड़ता है। स्कीमा ऑब्जेक्ट्स जैसे अनुक्रमों का लाभ उठाने में सक्षम होने वाले ट्रिगर्स पर भी ध्यान दें,[8] इस उदाहरण में audio_id_sequence.nexVal का उपयोग phone_book_audit तालिका में अद्वितीय प्राथमिक कुंजी उत्पन्न करने के लिए किया जाता है।
<वाक्यविन्यास प्रकाश लैंग = oracle11> ट्रिगर फोन_बुक_ऑडिट बनाएं या बदलें
प्रत्येक पंक्ति के लिए फोनबुक पर अद्यतन के पश्चात
शुरू
फोन_बुक_ऑडिट में प्रवेश करें (ऑडिट_आईडी, ऑडिट_चेंज, ऑडिट_एल_नाम, ऑडिट_एफ_नाम, ऑडिट_पुराना_फोन_नंबर, ऑडिट_नया_फोन_नंबर, ऑडिट_डेट) मान (audit_id_sequence.nextVal, 'अपडेट', :OLD.last_name, :OLD.first_name, :OLD.phone_number, :NEW.phone_number, SYSDATE);
अंत; </वाक्यविन्यास हाइलाइट>
अब अंतिम नाम 'जोन्स' वाले लोगों के लिए फोन_बुक टेबल पर अपडेट (एसक्यूएल) कॉल करना। <वाक्यविन्यास प्रकाश लैंग = oracle11> अद्यतन फोन_बुक सेट फोन_नंबर = '111-111-1111' जहां अंतिम_नाम = 'जोन्स'; </वाक्यविन्यास हाइलाइट>
Audit_ID | Audit_Change | F_Name | L_Name | New_Phone_Number | Old_Phone_Number | Audit_Date |
---|---|---|---|---|---|---|
1 | Update | Jordan | Jones | 111-111-1111 | 098-765-4321 | 02-MAY-14 |
2 | Update | Megan | Jones | 111-111-1111 | 111-222-3456 | 02-MAY-14 |
ध्यान दें कि phone_number_audit तालिका अब दो प्रविष्टियों से आपश्चात है। यह डेटाबेस के साथ दो प्रविष्टियों वाले होने के कारण है 'जोन्स' का अंतिम नाम। चूंकि अपडेट दो अलग-अलग पंक्ति मानों को संशोधित करता है, इसलिए बनाए गए ट्रिगर को दो बार कॉल किया गया था; एक बार प्रत्येक संशोधन के पश्चात।
आफ्टर -कथन-लेवल ट्रिगर
एक Oracle सिंटैक्सकथन ट्रिगर जिसे फोन_बुक तालिका में अद्यतन के पश्चात कहा जाता है। जब ट्रिगर को कॉल किया जाता है तो यह phone_book_edit_history तालिका में सम्मिलित करता है <वाक्यविन्यास प्रकाश लैंग = oracle11> ट्रिगर फोन_बुक_इतिहास बनाएं या बदलें
फोन_बुक पर अद्यतन के पश्चात
शुरू
फोन_बुक_एडिट_इतिहास में प्रवेश करें (audit_history_id, उपयोगकर्ता नाम, संशोधन, edit_date) मान (audit_history_id_sequence.nextVal, USER,'Update', SYSDATE);
अंत; </वाक्यविन्यास हाइलाइट>
अब उपरोक्त उदाहरण के समान ही अपडेट कर रहे हैं, हालांकि इस बारकथन लेवल ट्रिगर के साथ। <वाक्यविन्यास प्रकाश लैंग = oracle11> अद्यतन फोन_बुक सेट फोन_नंबर = '111-111-1111' जहां अंतिम_नाम = 'जोन्स'; </वाक्यविन्यास हाइलाइट>
Audit_History_ID | Username | Modification | Edit_Date |
---|---|---|---|
1 | HAUSCHBC | Update | 02-MAY-14 |
नतीजा दिखाता है कि ट्रिगर को केवल एक बार बुलाया गया था, भले ही अपडेट ने दो पंक्तियों को बदल दिया हो।
प्रत्येक से पूर्व - पंक्ति-स्तर ट्रिगर
यह उदाहरण प्रत्येक पंक्ति ट्रिगर से पूर्व प्रदर्शित करता है जो WHEN सशर्त का उपयोग करके INSERT को संशोधित करता है। यदि अंतिम नाम SUBSTR फ़ंक्शन का उपयोग करके 10 अक्षरों से बड़ा है[9] हम last_name कॉलम मान को संक्षेप में बदलते हैं।
<वाक्यविन्यास प्रकाश लैंग = oracle11> TRIGGER phone_book_insert बनाएं या बदलें
प्रत्येक पंक्ति के लिए फोन_बुक पर डालने से पूर्व WHEN (LENGTH(new.last_name) > 10)
शुरू
:new.last_name := SUBSTR(:new.last_name,0,1);
अंत; </वाक्यविन्यास हाइलाइट>
अब बड़े नाम वाले किसी व्यक्ति का INSERT कर रहे हैं। <वाक्यविन्यास प्रकाश लैंग = oracle11> फोन_बुक मूल्यों में प्रवेश करें (6, 'VeryVeryLongLastName', 'Erin', 'Minneapolis', 'MN', '989 यूनिवर्सिटी ड्राइव', '123-222-4456', 55408, TO_DATE('11/21/1991', 'MM/DD/ YYYY')); </वाक्यविन्यास हाइलाइट>
Person_ID | Last_Name | First_Name | City | State_Abbreviation | Address | Phone_Number | Zip_code | DOB |
---|---|---|---|---|---|---|---|---|
6 | V | Erin | Minneapolis | MN | 989 University Drive | 123-222-4456 | 55408 | 21-NOV-91 |
ट्रिगर ने उपरोक्त परिणाम के अनुसार काम किया, INSERT के मान को निष्पादित करने से पूर्व संशोधित किया।
पूर्व -कथन-लेवल ट्रिगर
डेटाबेस प्रतिबंधों को लागू करते समय BEFOREकथन ट्रिगर का उपयोग करना विशेष रूप से उपयोगी होता है।[10] यह उदाहरण प्रदर्शित करता है कि तालिका phone_book पर SOMEUSER नाम के किसी व्यक्ति पर प्रतिबंध कैसे लागू किया जाए।
<वाक्यविन्यास प्रकाश लैंग = oracle11> ट्रिगर हॉशबीसी बनाएं या बदलें
SOMEUSER.phone_book पर डालने से पूर्व
शुरू
RAISE_APPLICATION_ERROR ( संख्या => -20050, संदेश => 'त्रुटि संदेश यहां जाता है।');
अंत; </वाक्यविन्यास हाइलाइट>
अब, जब किसी INSERT का प्रयास करने के पश्चात SOMEUSER लॉग इन होता है तो यह त्रुटि संदेश दिखाई देगा:
SQL त्रुटि: ORA-20050: त्रुटि संदेश यहाँ जाता है।
इस तरह की कस्टम त्रुटियां इस बात पर प्रतिबंध लगाती हैं कि संख्या चर को किस रूप में परिभाषित किया जा सकता है। कई अन्य पूर्व-निर्धारित त्रुटियों के कारण यह चर -20000 से -20999 की सीमा में होना चाहिए।
संदर्भ
- ↑
Nanda, Arup; Burleson, Donald K. (2003). "9". In Burleson, Donald K. (ed.). Oracle Privacy Security Auditing: Includes Federal Law Compliance with HIPAA, Sarbanes Oxley and the Gramm Leach Bliley Act GLB. Oracle in-focus series. Vol. 47. Kittrell, North Carolina: Rampant TechPress. p. 511. ISBN 9780972751391. Retrieved 2018-04-17.
[...] system-level triggers [...] were introduced in Oracle8i. [...] system-level triggers are fired at specific system events such as logon, logoff, database startup, DDL execution, and servererror [...].
- ↑ "DDL Events - SQL Server".
- ↑ "PostgreSQL: Documentation: 9.0: CREATE TRIGGER". www.postgresql.org. 8 October 2015.
- ↑ MySQL 5.0 Reference Manual. "Triggers. MySQL 5.0 added limited support for triggers", Oracle Corporation, Retrieved on 4 March 2020.
- ↑ "MySQL :: MySQL 8.0 Reference Manual :: 25.3.1 Trigger Syntax and Examples".
- ↑ "Autonomous transactions". www.ibm.com. July 30, 2009.
- ↑ "6 Using Triggers". docs.oracle.com.
- ↑ "Oracle's Documentation on Sequences". Archived from the original on 2011-12-01.
- ↑ "Oracle SQL Functions – The Complete List". December 26, 2014.
- ↑ "Database PL/SQL Language Reference". docs.oracle.com.