অস্তিত্বের সীমাবদ্ধতা ফেলে দিতে পারে না এবং এটি তৈরিও করতে পারে না


16

উত্পাদন তথ্যের একটি অনুলিপি সহ কিছু মাইগ্রেশন স্ক্রিপ্টগুলি পরীক্ষার সময় (স্ক্রিপ্টগুলি ডেভেলপমেন্ট ডেটার সাথে সূক্ষ্মভাবে চালিত হয়) আমি একটি কৌতূহলী পরিস্থিতি পেয়েছি। একটি চুক্তি বদলেছে তাই আমি ড্রপ + অ্যাড কমান্ড জারি করছি:

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_UK1এসকিউএল বিকাশকারীর অনুসন্ধান বাক্সে টাইপ করি এবং ... এটি সেখানে! মালিক, সারণী নাম, টেবিলস্কেপ ... সবকিছু ম্যাচ: এটা একই নামের একটি ভিন্ন বস্তু নয়, এটা হল আমার মূল বাধ্যতা। সারণি সীমাবদ্ধতার বিবরণে উপস্থিত হয় তবে সারণির বিবরণে সীমাবদ্ধতা উপস্থিত হয় না।

আমার প্রশ্নগুলো:

  • এর ব্যাখ্যা কী?
  • আমি যখন লাইভ সার্ভারে প্রকৃত আপগ্রেড করব তখন কীভাবে তা নিশ্চিত হবে?

(সার্ভারটি 10 ​​জি এক্সই, আমার কাছে ট্যাগ তৈরির যথেষ্ট খ্যাতি নেই))


সম্ভবত এটি অন্য ধরণের অবজেক্ট হিসাবে তৈরি হয়েছিল এবং কোনও অনন্য বাধা নয়? হতে পারে অনন্য সূচক ..
মারিয়ান

প্রাথমিক তৈরিটি কি টেবিলের নামের চারপাশে উদ্ধৃতি দিয়ে চালানো যেতে পারে? এটি নামের কেসটিকে সংবেদনশীল করে তুলবে। যদি তা হয় তবে আপনি উদ্ধৃতি এবং একই কেস সহ ড্রপ করতে পারেন।
অ্যাডাম বাটলার

উত্তর:


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 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

কয়েক মিনিট আগে আমারও একই সমস্যা হয়েছিল ... এবং আমি একটি ব্যাখ্যা পেয়েছি।

একটি প্রাথমিক কী তৈরি করে, ওরাকল দুটি বস্তু তৈরি করে: একটি প্রতিবন্ধকতা এবং একটি সূচক, যা "ইউনিক্যু" অংশটি নিয়ন্ত্রণ করে।

সীমাবদ্ধতা বাদ দিয়ে, সূচক একই নাম ব্যবহার করে সূচিটি সেখানেই থাকে, তাই আপনি যদি ঠিক সম্পাদন করেন

alter table t drop constraint u1;

আপনি কেবল সীমাবদ্ধতা বাদ দিবেন। সূচকটি নামাতে, আপনাকে সম্পাদন করতে হবে

drop index u1;

এটি কাজ করা উচিত। বিকল্পভাবে, আপনি কমান্ডের সাথে একই সাথে এই দুটি কমান্ড করতে পারেন

alter table t drop constraint u1 including indexes;

কোন ডিবি? সহ
ওরাকলে

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

এটি আসলে কাজ করেছে। আজ দুপুরের পর থেকেই আমার একই সমস্যা ছিল এবং আমি এর সমাধানটি পেয়েছিলাম। কখনও কখনও নিয়ন্ত্রণগুলি কেস-সংবেদনশীল উপায়ে তৈরি করা হতে পারে, সেই ক্ষেত্রে, যখন আপনি এটি সরিয়ে ফেলেন তখন আপনাকে সীমাবদ্ধতার নামটি ডাবল কোটে লিখতে হবে।
শচীন 11

এবং এটা আমার জন্য কাজ করে। আমি সীমাবদ্ধতার নাম স্পষ্টভাবে উল্লেখ করি নি, এভাবে সিস্টেম এটিকে নিজস্ব উত্পন্ন নাম দিয়েছিল Relationship142এবং অন্যান্য NOT NULLবাধাটির নাম দেওয়া হয়েছিল SYS_C0015910। তাই SYS_C0015910সাধারণ অলটার ক্যোরিয়াস সহ সফলভাবে মুছে ফেলা হয়েছে, তবে ডাবল কোটগুলিরRelationship142 দরকার ছিল
শচিন

1
আপনি দ্বিগুণ উদ্ধৃতি ব্যবহার করে সীমাবদ্ধতা তৈরি করেছেন, যেমন: এর alter table ... add constraint "Relationship143" ... "Relationship143"চেয়ে আসলে আলাদা একটি নাম RELATIONSHIP143। কিন্তু "RELATIONSHIP143"RELATIONSHIP143হয় অভিন্ন
a_horse_with_no_name

2
ওরাকল (ডাটাবেস) নিজের মতো কোনও নাম তৈরি করবে না"Relationship143" । এটি সম্ভবত আপনার সরঞ্জামগুলির মধ্যে একটি ছিল এটি। যাইহোক: যেমন দাঁড়িয়েছে, আপনার উত্তরটি মূল প্রশ্নের প্রসঙ্গে কেবল ভুল is
a_horse_with_no_name
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.