2010-04-23 9 views
5

2 कॉलम, एक (अद्वितीय) और बी के साथ तालिका को रोकने के लिए एक अच्छा तरीका क्या है, जिसमें कोई रिकॉर्ड होने से कॉलम बी कॉलम में किसी भी मान के बराबर है? यह इस तरह के सुधार की एक तालिका के लिए इस्तेमाल किया जाएगा,ओरेकल में किसी भी कॉलम के समान कॉल वाले कॉलम बी को कैसे रोकें?

MR -> Mr 
Prf. -> Prof. 
MRs -> Mrs 

मैं देख सकता हूँ कि यह कैसे एक ट्रिगर और एक सबक्वेरी कोई अन्य समकालीन गतिविधि मानते हुए लेकिन एक और अधिक कथात्मक दृष्टिकोण के साथ किया जा सकता है बेहतर होगा।

यह वही रोका जाना चाहिए का एक उदाहरण है,

Wing Commdr. -> Wing Cdr. 
Wing Cdr. -> Wing Commander 

आदर्श रूप में समाधान समवर्ती आवेषण और अद्यतन के साथ काम करेगा।

+0

क्या इसका इरादा है कि कॉलम ए तालिका में अद्वितीय हो? – dpbradley

+0

हां, कॉलम ए में विशिष्टता लागू होनी चाहिए। –

उत्तर

2

आप अपनी आवश्यकताओं को लागू करने के लिए भौतिक दृश्य का उपयोग कर सकते हैं (10.2.0.1 के साथ परीक्षण किया गया)।

SQL> CREATE TABLE t (a VARCHAR2(20) NOT NULL PRIMARY KEY, 
    2     b VARCHAR2(20) NOT NULL); 
Table created 

SQL> CREATE MATERIALIZED VIEW LOG ON t WITH (b), ROWID INCLUDING NEW VALUES;  
Materialized view log created 

SQL> CREATE MATERIALIZED VIEW mv 
    2  REFRESH FAST ON COMMIT 
    3 AS 
    4 SELECT 1 umarker, COUNT(*) c, count(a) cc, a val_col 
    5 FROM t 
    6 GROUP BY a 
    7 UNION ALL 
    8 SELECT 2 umarker, COUNT(*), COUNT(b), b 
    9 FROM t 
10 GROUP BY b;  
Materialized view created 

SQL> CREATE UNIQUE INDEX idx ON mv (val_col);  
Index created 

अद्वितीय सूचकांक यह सुनिश्चित करेगा कि आपके पास दोनों कॉलम (दो पंक्तियों पर) में समान मूल्य न हो।

SQL> INSERT INTO t VALUES ('Wing Commdr.', 'Wing Cdr.');  
1 row inserted 

SQL> COMMIT;  
Commit complete 

SQL> INSERT INTO t VALUES ('Wing Cdr.', 'Wing Commander');  
1 row inserted 

SQL> COMMIT;  

ORA-12008: erreur dans le chemin de régénération de la vue matérialisée 
ORA-00001: violation de contrainte unique (VNZ.IDX) 

SQL> INSERT INTO t VALUES ('X', 'Wing Commdr.');  
1 row inserted 

SQL> COMMIT; 

ORA-12008: erreur dans le chemin de régénération de la vue matérialisée 
ORA-00001: violation de contrainte unique (VNZ.IDX) 

दौरान प्रतिबद्ध है, लेकिन केवल कॉलम ए और बी के मूल्यों पर यह क्रमानुसार होगा (यानी: सामान्य रूप में यह समवर्ती संबंध तोड़ना गतिविधि को रोकने नहीं होना चाहिए)।

यूनिकिटी केवल COMMIT समय पर जांच की जाएगी और कुछ टूल प्रतिबद्ध होने की उम्मीद नहीं करते हैं और अनुपयोगी व्यवहार कर सकते हैं। साथ ही जब COMMIT विफल हो जाता है, तो संपूर्ण लेनदेन वापस लुढ़का जाता है और आप किसी भी असामान्य परिवर्तन को खो देते हैं (आप "पुनः प्रयास नहीं कर सकते")।

+0

मुझे यह समाधान पसंद है क्योंकि यह एक सूचकांक में अखंडता की ज़िम्मेदारी को धक्का देता है। –

0

सत्र पर विचार करें एक 'डालने' ('ए', 'बी') लेकिन काम नहीं कर रहा है, फिर सत्र बी सम्मिलित करता है ('बी', 'ए') बिना काम किए। न तो सत्र दूसरे द्वारा दर्ज रिकॉर्ड देख सकता है। फिर सत्र प्रतिबद्ध करते हैं।

जब आप एक सत्र सम्मिलित करते हैं (इन्टर ट्रिगर से पहले) पूरी तालिका को लॉक करके आप INRERT ट्रिगर के बाद चेक को क्रमबद्ध कर सकते हैं। यदि तालिका में आपके द्वारा इंगित सामग्री है, तो उसे बहुत सी गतिविधि नहीं दिखाई देनी चाहिए ताकि क्रमबद्धता कोई समस्या न हो।

संबंधित मुद्दे