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

ORA-04091:तालिका [blah] उत्परिवर्तित हो रही है, ट्रिगर/फ़ंक्शन इसे नहीं देख सकता है

मुझे लगता है कि मैं आपके विवरण से असहमत हूं कि ट्रिगर क्या करने की कोशिश कर रहा है। मुझे ऐसा लगता है कि यह इस व्यवसाय नियम को लागू करने के लिए है:t1_appnt_event के दिए गए मान के लिए, एक समय में केवल एक पंक्ति का गैर-शून्य मान oft1_prnt_t1_pk हो सकता है। (इससे कोई फ़र्क नहीं पड़ता कि दूसरे कॉलम में उनका मान समान है या नहीं।)

दिलचस्प बात यह है कि इसे t1_appnt_event के अद्यतन के लिए परिभाषित किया गया है, लेकिन दूसरे कॉलम के लिए नहीं, इसलिए मुझे लगता है कि कोई दूसरा कॉलम अपडेट करके नियम तोड़ सकता है, जब तक कि उस कॉलम के लिए अलग ट्रिगर न हो।

ऐसा कोई तरीका हो सकता है जिससे आप एक फ़ंक्शन-आधारित अनुक्रमणिका बना सकते हैं जो इस नियम को लागू करती है ताकि आप पूरी तरह से ट्रिगर से छुटकारा पा सकें। मैं एक तरीका लेकर आया हूं लेकिन इसके लिए कुछ मान्यताओं की आवश्यकता है:

  • तालिका में एक संख्यात्मक प्राथमिक कुंजी है
  • प्राथमिक कुंजी और t1_prnt_t1_pk दोनों हमेशा धनात्मक संख्याएं होती हैं

अगर ये धारणाएं सही हैं, तो आप इस तरह से एक फंक्शन बना सकते हैं:

dev> create or replace function f( a number, b number ) return number deterministic as
  2  begin
  3    if a is null then return 0-b; else return a; end if;
  4  end;

और इस तरह की एक अनुक्रमणिका:

CREATE UNIQUE INDEX my_index ON my_table
  ( t1_appnt_event, f( t1_prnt_t1_pk, primary_key_column) );

तो पंक्तियाँ जहाँ PMNT कॉलम NULL है, इंडेक्स में प्राथमिक कुंजी के व्युत्क्रम के साथ दूसरे मान के रूप में दिखाई देगी, इसलिए वे कभी भी एक दूसरे के साथ संघर्ष नहीं करेंगे। पंक्तियाँ जहाँ यह NULL नहीं है, वे स्तंभ के वास्तविक (सकारात्मक) मान का उपयोग करेंगी। बाधा उल्लंघन का एकमात्र तरीका यह होगा कि यदि दो पंक्तियों में दोनों स्तंभों में समान गैर-शून्य मान हों।

यह शायद अत्यधिक "चतुर" है, लेकिन यह आपकी समस्या को हल करने में आपकी सहायता कर सकता है।

पॉल टॉम्बलिन से अपडेट:मैं उस मूल विचार के अपडेट के साथ गया था जिसे इगोर ने टिप्पणियों में रखा था:

 CREATE UNIQUE INDEX cappec_ccip_uniq_idx 
 ON tbl1 (t1_appnt_event, 
    CASE WHEN t1_prnt_t1_pk IS NOT NULL THEN 1 ELSE t1_pk END);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इश्यू बिल्डिंग cx_Oracle - libclntsh.so.11.1 => नहीं मिला

  2. असाइनमेंट के लिए Oracle कर्सर

  3. मेरे एसक्यूएल परिणामों को डुप्लिकेट कैसे करें?

  4. कोलन साइन क्या करता है :SQL क्वेरी में क्या करें?

  5. oracle sql में ज्वाइन कीवर्ड और इनर जॉइन कीवर्ड में क्या अंतर है?