सामान्य तौर पर, आप इस प्रकार की बाधा को ट्रिगर में लागू नहीं कर सकते। आपको एक बाधा का उपयोग करने की आवश्यकता होगी।
यदि आप ट्रिगर का उपयोग करने का प्रयास करते हैं तो आपको जिस समस्या का सामना करना पड़ेगा वह यह है कि आप आम तौर पर "म्यूटिंग टेबल" अपवाद का सामना करेंगे। सामान्य तौर पर, तालिका A पर एक पंक्ति-स्तरीय ट्रिगर (अर्थात properties
) तालिका A को क्वेरी नहीं कर सकता। आप एक पैकेज बनाकर, उस पैकेज में एक संग्रह बनाकर, पहले स्टेटमेंट ट्रिगर में संग्रह को प्रारंभ करके, पंक्ति-स्तरीय ट्रिगर में संग्रह में डाली गई या अपडेट की गई कुंजियों को लिखकर उस समस्या को हल कर सकते हैं। , और फिर आफ्टर स्टेटमेंट ट्रिगर में संग्रह के तत्वों के माध्यम से पुनरावृति करना और तालिका के विरुद्ध उपयुक्त DML जारी करना। हालाँकि, इसमें बहुत सारे चलते हुए टुकड़े और बहुत सारी जटिलताएँ शामिल हैं (हालाँकि जटिलता कम हो जाती है यदि आप 11g पर हैं और इसके बजाय एक कंपाउंड ट्रिगर का उपयोग कर सकते हैं)।
इसके अतिरिक्त, यदि आप किसी ट्रिगर का उपयोग करने का प्रयास करते हैं, तो आप बहु-उपयोगकर्ता परिवेशों में समस्याओं का सामना करेंगे। यदि उपयोगकर्ता A एक सत्र में एक पंक्ति सम्मिलित करता है और उपयोगकर्ता B उपयोगकर्ता A के आने से पहले एक अलग सत्र में एक डुप्लिकेट पंक्ति सम्मिलित करता है, तो सत्र का ट्रिगर डुप्लिकेट पंक्ति का पता नहीं लगाएगा। तालिका में सम्मिलन को क्रमबद्ध करने के लिए आप मूल तालिका में एक पंक्ति को स्पष्ट रूप से लॉक करके इस तरह की समस्या के आसपास संभावित रूप से काम कर सकते हैं (जानबूझकर एप्लिकेशन को धीमा और कम स्केलेबल बनाना)। लेकिन एक बाधा अधिक कुशल और व्यावहारिक समाधान होगा।
यह सब कहा जा रहा है, यदि आप INSERT ... VALUES
का उपयोग करके केवल एकल-पंक्ति प्रविष्टियां करते हैं सिंटैक्स और अपने आप को एक सत्र तक सीमित रखें, आपका ट्रिगर काम करता प्रतीत होता है
SQL> ed
Wrote file afiedt.buf
1 create table Properties(
2 idProperties number(10) NOT NULL,
3 Address_FK number(20),
4 Ownership_FK number(20)
5* )
SQL> /
Table created.
SQL> CREATE OR REPLACE TRIGGER Check_Duplicate
2 before insert or update on properties
3 FOR each ROW
4
5 declare
6 v_dup number;
7
8 begin
9 select count(idProperties) INTO v_dup from properties where Address_FK=
:NEW.Address_FK and
10 Ownership_FK=:NEW.Ownership_FK;
11
12 if v_dup > 0 then
13 Raise_Application_Error (-20100, 'This property already exists. The inse
rt is cancelled.');
14 end if;
15 end;
16 /
Trigger created.
SQL> insert into properties values( 1, 10, 100 );
1 row created.
SQL> insert into properties values( 2, 10, 100 );
insert into properties values( 2, 10, 100 )
*
ERROR at line 1:
ORA-20100: This property already exists. The insert is cancelled.
ORA-06512: at "SCOTT.CHECK_DUPLICATE", line 9
ORA-04088: error during execution of trigger 'SCOTT.CHECK_DUPLICATE'