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

कैसे एक अद्वितीय बाधा उल्लंघन के आसपास पाने के लिए?

एक विकल्प instead of . का उपयोग करना होगा चालू कर देना। हालांकि, इस समाधान के लिए आपको अपनी तालिकाओं का नाम बदलने और उनके नामों के साथ दृश्य बनाने की आवश्यकता है। इस तरह आप एप्लिकेशन लॉजिक को प्रभावित नहीं करते हैं, हालांकि यह समग्र प्रदर्शन को प्रभावित कर सकता है, इसलिए इसका ठीक से परीक्षण किया जाना चाहिए।

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

वैसे भी, एक सरल उदाहरण के नीचे जिसे आप अपने तर्क पर लागू कर सकते हैं

SQL> create table t ( c1 number primary key , c2 varchar2(1) ) ;

Table created.

SQL> alter table t rename to tbl_t ;

Table altered.

SQL>  create view t as ( select c1 , c2 from tbl_t ) ;

View created.

अब हम instead of . बनाते हैं ट्रिगर

SQL> create or replace trigger tr_v_t
  2  instead of insert
  3  on t
  4  for each row
  5  declare
  6    pk_violation_exception exception;
  7    pragma exception_init(pk_violation_exception, -00001);
  8  begin
  9    insert into tbl_t (c1,c2)
 10    values ( :new.c1,:new.c2 );
 11    exception
 12      when pk_violation_exception then
 13        dbms_output.put_line('ora-00001 (pk_violation_exception) captured');
 14        update tbl_t
 15        set c2   = :new.c2
 16        where c1 = :new.c1 ;
 17* end;
SQL> /

Trigger created.

इस ट्रिगर के साथ, बाधा का उल्लंघन करने का कोई भी प्रयास अंतिम तालिका में मूल्य के अद्यतन को संभव बना देगा।

SQL> select * from t ;

no rows selected

SQL> insert into t values ( 1 , 'A' ) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> insert into t values ( 2, 'B' ) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> insert into t values ( 2, 'C' ) ;
ORA-00001 (pk_violation_exception) captured

1 row created.

SQL> select * from tbl_t ;

        C1 C
---------- -
         1 A
         2 C



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अनुक्रम और ट्रिगर के साथ oracle autoincrement सही ढंग से काम नहीं कर रहा है

  2. शीर्ष 30 सबसे उपयोगी समवर्ती प्रबंधक प्रश्न

  3. JDBC स्वचालित क्वेरी बहुत धीमी हो गई

  4. Oracle में केवल गैर-अल्फ़ान्यूमेरिक वर्ण वाली पंक्तियों को वापस करने के 2 तरीके

  5. मैं जावा/जेडीबीसी का उपयोग करके ओरेकल डेटाबेस में 4000 वर्णों से अधिक लंबी स्ट्रिंग कैसे संग्रहीत करूं?