कोई भी अड़चन नहीं छोड़ सकता है और इसे भी नहीं बना सकता है


16

उत्पादन डेटा की प्रतिलिपि के साथ कुछ माइग्रेशन स्क्रिप्ट का परीक्षण करते समय (स्क्रिप्ट विकास डेटा के साथ ठीक चलती हैं) मुझे एक जिज्ञासु स्थिति मिली। एक CONSTRAINT बदल गया है इसलिए मैं DROP + ADD कमांड जारी कर रहा हूं:

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;

ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
    CONTROL_ID,
    CALLE_AYTO_DUPL
)
ENABLE;

DROP कमांड ने ठीक काम किया लेकिन ADD एक विफल रहा। अब, मैं एक दुष्चक्र में हूँ। मैं बाधा को नहीं छोड़ सकता क्योंकि यह मौजूद नहीं है (आरंभिक बूंद अपेक्षित रूप से काम करती है):

ORA-02443: बाधा नहीं गिरा सकता - कोई भी बाधा नहीं

और मैं इसे नहीं बना सकता क्योंकि नाम पहले से मौजूद है:

ORA-00955: नाम पहले से ही किसी मौजूदा ऑब्जेक्ट द्वारा उपयोग किया जाता है

मैं A_DUP_CALLE_UK1SQL डेवलपर के खोज बॉक्स में टाइप करता हूँ और ... वहाँ है! मालिक, टेबल का नाम, टेबलस्केप ... सब कुछ मेल खाता है: यह एक ही नाम के साथ एक अलग वस्तु नहीं है, यह है अपने मूल बाधा। बाधा विवरण में तालिका दिखाई देती है, लेकिन तालिका के विवरण में बाधा दिखाई नहीं देती है।

मेरे सवाल:

  • इसके लिए क्या स्पष्टीकरण है?
  • जब मैं लाइव सर्वर में वास्तविक अपग्रेड करता हूं तो मैं यह कैसे सुनिश्चित कर सकता हूं?

(सर्वर 10g XE है, टैग बनाने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है।)


शायद यह अन्य प्रकार की वस्तु के रूप में बनाया गया था और एक अद्वितीय बाधा नहीं थी? शायद अनूठा सूचकांक ..
मैरियन

प्रारंभिक नाम तालिका नाम के आसपास उद्धरण के साथ चलाए जा सकते थे? यह नाम मामले को संवेदनशील बना देगा। यदि ऐसा है तो आप उद्धरण और उसी मामले के साथ छोड़ सकते हैं।
एडम बटलर

जवाबों:


13

एक अनुमान के अनुसार मैं कहूंगा कि मैरिएन सही है और यह एक अद्वितीय सूचकांक और एक ही नाम वाले बाधा के कारण होता है, जैसे:

create table t( k1 integer, k2 integer, 
                constraint u1 unique(k1,k2) using index(create unique index u1 on t(k1,k2)),
                constraint u2 unique(k2,k1) using index u1);

select count(*) from user_indexes where index_name='U1';

COUNT(*)               
---------------------- 
1  

alter table t drop constraint u1;

select count(*) from user_indexes where index_name='U1';

COUNT(*)               
---------------------- 
1  

आम तौर पर जब आप एक अद्वितीय बाधा जोड़ते हैं, तो एक ही नाम के साथ एक अद्वितीय सूचकांक बनाया जाता है - लेकिन सूचकांक और बाधा एक ही चीज नहीं हैं। यह देखने के all_indexesलिए एक नज़र रखें कि क्या कोई सूचकांक कहा जाता है A_DUP_CALLE_UK1और कोशिश करें कि क्या आप इसे छोड़ने से पहले इसे किसी और चीज़ द्वारा उपयोग करते हैं या नहीं!


यह मुद्दा था। expकमांड द्वारा उत्पन्न डंप फ़ाइल में एक CREATE UNIQUE INDEX "A_DUP_CALLE_UK1" ...कथन है जो मूल स्क्रिप्ट सेट में मौजूद नहीं है।
अल्वारो गोंजालेज

6

बहुत अजीब लगता है।

तुम दौड़ सकते हो:

 SELECT *
 FROM user_objects
 WHERE object_name = 'A_DUP_CALLE_UK1'

यह जाँचने के लिए कि ओरेकल किस प्रकार की वस्तु के बारे में शिकायत करता है। फिर आप उसके लिए अनुप्रयुक्त DROP कथन चला सकते हैं।

केवल एक और चीज जिसके बारे में मैं सोच सकता हूं वह DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTSयह है कि उस तालिका से संबंधित हर चीज से छुटकारा पाने के लिए पूरी तरह से तालिका को छोड़ दें और फिर इसे पूरी तरह से फिर से बनाएं।

यदि तालिका में मूल्यवान डेटा है, तो आप पहले इसका बैकअप बना सकते हैं:

CREATE TABLE old_data
AS
SELECT *
FROM A_DUP_CALLE;

एक बार जब आप तालिका को फिर से बना लेते हैं, तो आप कर सकते हैं

INSERT INTO A_DUP_CALLE (col1, col2, col3) 
SELECT col1, col2, col3
FROM old_data

डेटा को पुनर्स्थापित करने के लिए।


4

मैं कुछ ही मिनट पहले एक ही समस्या है ... और मैं एक स्पष्टीकरण मिल गया है।

एक प्राथमिक कुंजी बनाकर, Oracle दो ऑब्जेक्ट बनाता है: एक बाधा, और एक सूचकांक, जो "UNIQUE" भाग को नियंत्रित करता है।

बाधा को गिराकर, सूचकांक उसी नाम का उपयोग करते हुए, सूचकांक वहीं रहता है, इसलिए यदि आप बस निष्पादित करते हैं

alter table t drop constraint u1;

आप केवल बाधा को छोड़ देंगे। सूचकांक को छोड़ने के लिए, आपको निष्पादित करना होगा

drop index u1;

यह काम करना चाहिए। वैकल्पिक रूप से, आप इन दोनों कमांड को एक ही समय में कमांड के साथ कर सकते हैं

alter table t drop constraint u1 including indexes;

कौन सी डीबी? सहित काम नहीं करता है oracle
Derick

1

प्राथमिक कुंजी बाधा सूचकांक के साथ आती है। आप अड़चन छोड़ते हैं लेकिन सूचकांक नहीं। चेक:

select * from ALL_OBJECTS where OBJECT_NAME = 'PK_TBL_CONSTR';

और जैसा कि आप देख OBJECT_TYPEहै INDEX

इसलिए दोनों करें:

alter table TBL drop constraint PK_TBL_CONSTR;
drop index PK_TBL_CONSTR;

1

यह करो

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT "A_DUP_CALLE_UK1";

यह काम करेगा।

छवि: यहाँ छवि विवरण दर्ज करें


नहीं यह नहीं चलेगा। आपका कथन ठीक वैसा ही कथन है जैसा प्रश्न में पहला कथन है:ALTER TABLE A_DUP_CALLE DROP CONSTRAINT A_DUP_CALLE_UK1;
a_horse_with_no_name

यह वास्तव में काम किया। आज दोपहर के बाद से मुझे वही समस्या हो रही थी, और मैं इस समाधान को खोज रहा था। कभी-कभी CONSTRAINTS एक केस-संवेदी तरीके से बनाए गए हो सकते हैं, जिस स्थिति में, आपको इसे छोड़ने पर बाधा नाम को दोहरे उद्धरण चिह्नों में रखना होगा।
सचिन

और यह मेरे लिए काम किया। मैंने स्पष्ट रूप से बाधाओं का नाम नहीं दिया था, इस प्रकार प्रणाली ने इसे स्वयं का उत्पन्न नाम दिया Relationship142और अन्य NOT NULLबाधा को नाम दिया गया SYS_C0015910। तो SYS_C0015910सफलतापूर्वक सरल ALTER क्वेरी के साथ नष्ट कर दिया गया है, लेकिन Relationship142जरूरत डबल कोट्स
सचिन

1
आपने बनाया दोहरे उद्धरण चिह्नों का उपयोग करते हुए बाधाओं का किया, उदाहरण के लिए: alter table ... add constraint "Relationship143" ... "Relationship143"वास्तव में एक अलग नाम है RELATIONSHIP143। लेकिन "RELATIONSHIP143"और RELATIONSHIP143कर रहे हैं समान
a_horse_with_no_name

2
Oracle (डेटाबेस) कभी भी अपने नाम जैसा नाम नहीं बनाएगा "Relationship143"। यह शायद ऐसा करने वाला आपका एक उपकरण था। वैसे भी: जैसा कि यह खड़ा है, मूल प्रश्न के संदर्भ में आपका उत्तर बस गलत है।
a_horse_with_no_name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.