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

तालिका में एकाधिक बाधाएं:सभी उल्लंघन कैसे प्राप्त करें?

सभी संभावित बाधा उल्लंघनों की रिपोर्ट करने का कोई सीधा तरीका नहीं है। क्योंकि जब ओरेकल किसी बाधा के पहले उल्लंघन पर ठोकर खाता है, तो कोई और मूल्यांकन संभव नहीं है, कथन विफल हो जाता है, जब तक कि उस बाधा को स्थगित नहीं किया जाता है या log errors डीएमएल स्टेटमेंट में क्लॉज को शामिल किया गया है। लेकिन यह ध्यान दिया जाना चाहिए कि log errors क्लॉज सभी संभावित बाधा उल्लंघनों को पकड़ने में सक्षम नहीं होगा, बस पहले एक को रिकॉर्ड करें।

संभावित तरीकों में से एक है:

  1. exceptions टेबल। यह ora_home/rdbms/admin/utlexpt.sql executing को क्रियान्वित करके किया जा सकता है लिखी हुई कहानी। तालिका की संरचना बहुत सरल है;
  2. सभी तालिका बाधाओं को अक्षम करें;
  3. डीएमएल निष्पादित करें;
  4. exceptions into <<exception table name>> . में सक्षम करें खंड। यदि आपने utlexpt.sql executed निष्पादित किया है स्क्रिप्ट, तालिका अपवादों का नाम संग्रहीत किया जा रहा है exceptions

टेस्ट टेबल:

create table t1(
  col1 number not null,
  col2 number not null,
  col3 number not null,
  col4 number not null
);

एक insert निष्पादित करने का प्रयास करें कथन:

insert into t1(col1, col2, col3, col4)
  values(1, null, 2, null);

Error report -
SQL Error: ORA-01400: cannot insert NULL into ("HR"."T1"."COL2")

तालिका की सभी बाधाओं को अक्षम करें:

alter table T1 disable constraint SYS_C009951;     
alter table T1 disable constraint SYS_C009950;     
alter table T1 disable constraint SYS_C009953;     
alter table T1 disable constraint SYS_C009952; 

पहले विफल insert . को निष्पादित करने का प्रयास करें फिर से बयान:

insert into t1(col1, col2, col3, col4)
  values(1, null, 2, null);

1 rows inserted.

commit;

अब, exceptions . में टेबल की बाधाओं और स्टोर अपवादों को सक्षम करें, यदि कोई हो, तो तालिका:

alter table T1 enable constraint SYS_C009951 exceptions into exceptions; 
alter table T1 enable constraint SYS_C009950 exceptions into exceptions; 
alter table T1 enable constraint SYS_C009953 exceptions into exceptions; 
alter table T1 enable constraint SYS_C009952 exceptions into exceptions; 

exceptions की जांच करें तालिका:

column row_id     format a30;
column owner      format a7;
column table_name format a10;
column constraint format a12;

select *
  from exceptions 

ROW_ID                         OWNER   TABLE_NAME CONSTRAINT 
------------------------------ ------- -------    ------------
AAAWmUAAJAAAF6WAAA             HR      T1         SYS_C009951  
AAAWmUAAJAAAF6WAAA             HR      T1         SYS_C009953

दो बाधाओं का उल्लंघन किया गया है। कॉलम के नाम जानने के लिए, बस user_cons_columns . देखें डेटा डिक्शनरी व्यू:

column table_name   format a10;
column column_name  format a7;
column row_id       format a20;

select e.table_name
     , t.COLUMN_NAME
     , e.ROW_ID
  from user_cons_columns t
  join exceptions e
    on (e.constraint = t.constraint_name)


TABLE_NAME COLUMN_NAME ROW_ID             
---------- ----------  --------------------
T1         COL2        AAAWmUAAJAAAF6WAAA   
T1         COL4        AAAWmUAAJAAAF6WAAA

उपरोक्त क्वेरी हमें कॉलम नाम, और समस्याग्रस्त रिकॉर्ड की पंक्तियाँ देती है। हाथ में पंक्तियाँ होने से, उन अभिलेखों को खोजने में कोई समस्या नहीं होनी चाहिए जो बाधा उल्लंघन का कारण बनते हैं, उन्हें ठीक करते हैं, और बाधाओं को एक बार फिर से सक्षम करते हैं।

यहाँ वह स्क्रिप्ट है जिसका उपयोग alter table उत्पन्न करने के लिए किया गया है बाधाओं को सक्षम और अक्षम करने के लिए कथन:

column cons_disable format a50
column cons_enable format a72

select 'alter table ' || t.table_name || ' disable constraint '|| 
        t.constraint_name || ';' as cons_disable
     , 'alter table ' || t.table_name || ' enable constraint '|| 
        t.constraint_name || ' exceptions into exceptions;' as cons_enable
  from user_constraints t
where t.table_name = 'T1'
order by t.constraint_type


  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 तालिका की अंतिम पंक्ति कैसे प्राप्त करें?

  2. मेरे द्वारा चलाए जा रहे Oracle क्लाइंट का कौन सा संस्करण निर्धारित करने का सबसे अच्छा तरीका क्या है?

  3. ODP.NET प्रबंधित - अनुरोधित .Net Framework डेटा प्रदाता खोजने में असमर्थ

  4. विंडोज पर Oracle डाटाबेस 12c सॉफ्टवेयर इंस्टाल करना

  5. पीएल/एसक्यूएल में अगर स्टेटमेंट कंडीशन में स्केलर सबक्वेरी