ওরাকলে সমস্ত সারণির সীমাবদ্ধতা অক্ষম করুন


96

কীভাবে আমি একক কমান্ড দিয়ে ওরাকলে সমস্ত সারণি সীমাবদ্ধতা অক্ষম করতে পারি? এটি কোনও একক টেবিল, টেবিলের তালিকা বা সমস্ত টেবিলের জন্য হতে পারে be

উত্তর:


148

অস্থায়ী স্পুল ফাইলগুলি লেখা এড়ানো ভাল। একটি পিএল / এসকিউএল ব্লক ব্যবহার করুন। আপনি এটি এসকিউএল * প্লাস থেকে চালাতে পারেন বা এই জিনিসটিকে একটি প্যাকেজ বা পদ্ধতিতে রাখতে পারেন। দেখার সীমাবদ্ধতা এড়ানোর জন্য USER_TABLES এ যোগদান করুন।

এটি অসম্ভব যে আপনি সত্যিকার অর্থে সমস্ত বাধা নিষ্ক্রিয় করতে চান (নাল নয়, প্রাথমিক কীগুলি ইত্যাদি)) WHERE ধারাটিতে সীমাবদ্ধতা_ টাইপ স্থাপন সম্পর্কে আপনার ভাবা উচিত।

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'ENABLED'
   AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
   ORDER BY c.constraint_type DESC)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
  END LOOP;
END;
/

সীমাবদ্ধতাগুলি আবার সক্ষম করা কিছুটা জটিল - আপনি বিদেশী কী সীমাবদ্ধতার বিষয়ে উল্লেখ করার আগে আপনাকে প্রাথমিক কী বাধাগুলি সক্ষম করতে হবে। সীমাবদ্ধতা_প্রকারভেদে অর্ডার ব্যবহার করে এটি করা যেতে পারে। 'পি' = প্রাথমিক কী, 'আর' = বিদেশী কী।

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'DISABLED'
   ORDER BY c.constraint_type)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
  END LOOP;
END;
/

4
প্রথম কোড বিভাগটি কী কী বিদেশী কীগুলি অক্ষম করার আগে প্রাথমিক কীগুলি অক্ষম করার চেষ্টা করছে না?
ডেভিড অ্যালড্রিজ

@ ডেভিড আমার মনে হয় আমি প্রথম বিভাগটি নিয়ে এই ইস্যুটিতে পৌঁছেছি। আমি 'অর্ডার বাই সি সি কনট্র্যান্ট_টাইপ' এবং বন্ধ ') এর মধ্যে' ডিইএসসি 'যুক্ত করে এটি সমাধান করেছি
AndreiM

@WW আমার প্রশংসা এটি কেবলমাত্র এসকিউএল বিবৃতি লেখার ঝামেলা বাঁচিয়েছে সীমাবদ্ধতার বিবরণ সক্ষম ও অক্ষম করার জন্য।
ডেভ

4
সূচি-সংগঠিত টেবিলগুলিতে প্রাথমিক কীগুলি অক্ষম করা যায় না। আপনি AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')প্রথম কোড বিভাগে যুক্ত করে এগুলি পরিচালনা করতে পারেন ।
অ্যান্ড্রু মিলার

4
সতর্কতা: আপনার যদি ইতিমধ্যে নিষ্ক্রিয় কন্ট্রেন্টগুলি থাকে তবে সমস্ত বাধা সেই পিএল / এসকিউএল পদ্ধতিটি ব্যবহার করে সক্রিয় করা হবে। সেগুলিকে অক্ষম রাখার বিষয়টি নিশ্চিত করার জন্য আপনাকে সেই সমস্ত বাধাগুলি ফিল্টার করতে হবে।
nachouve

11

সীমাবদ্ধতার মধ্যে নির্ভরতা গণনা করা:

SET Serveroutput ON
BEGIN
    FOR c IN
    (SELECT c.owner,c.table_name,c.constraint_name
    FROM user_constraints c,user_tables t
    WHERE c.table_name=t.table_name
    AND c.status='ENABLED'
    ORDER BY c.constraint_type DESC,c.last_change DESC
    )
    LOOP
        FOR D IN
        (SELECT P.Table_Name Parent_Table,C1.Table_Name Child_Table,C1.Owner,P.Constraint_Name Parent_Constraint,
            c1.constraint_name Child_Constraint
        FROM user_constraints p
        JOIN user_constraints c1 ON(p.constraint_name=c1.r_constraint_name)
        WHERE(p.constraint_type='P'
        OR p.constraint_type='U')
        AND c1.constraint_type='R'
        AND p.table_name=UPPER(c.table_name)
        )
        LOOP
            dbms_output.put_line('. Disable the constraint ' || d.Child_Constraint ||' (on table '||d.owner || '.' ||
            d.Child_Table || ')') ;
            dbms_utility.exec_ddl_statement('alter table ' || d.owner || '.' ||d.Child_Table || ' disable constraint ' ||
            d.Child_Constraint) ;
        END LOOP;
    END LOOP;
END;
/

5

এটি একটি একক আদেশ নয়, তবে আমি এটি কীভাবে করব তা এখানে। নিম্নলিখিত স্ক্রিপ্টটি এসকিউএল * প্লাসে চলার জন্য ডিজাইন করা হয়েছে। দ্রষ্টব্য, আমি ইচ্ছাকৃতভাবে এটি কেবল বর্তমান স্কিমার মধ্যে কাজ করার জন্য লিখেছি।

set heading off

spool drop_constraints.out

select
    'alter table ' || 
    owner || '.' || 
    table_name || 
    ' disable constraint ' || -- or 'drop' if you want to permanently remove
    constraint_name || ';'
from
    user_constraints;

spool off

set heading on

@drop_constraints.out

আপনি যা ফেলেছেন তা সীমাবদ্ধ করতে, ফিল্টারটি নির্বাচিত বিবৃতিটিতে একটি ধারা যুক্ত করুন: -

  • কেবলমাত্র নির্দিষ্ট ধরণের সীমাবদ্ধতাগুলি ফেলে দেওয়ার জন্য সীমাবদ্ধতা_প্রকারে ফিল্টার করুন
  • কেবল এক বা কয়েকটি টেবিলের জন্য এটি করতে টেবিল_নামে ফিল্টার করুন।

বর্তমান স্কিমা থেকে বেশি চালানোর জন্য, ব্যবহারকারী_কন্ট্রেন্টের পরিবর্তে all_constraints থেকে নির্বাচন করতে নির্বাচন বিবরণটি সংশোধন করুন।

দ্রষ্টব্য - কোনও কারণে আমি পূর্ববর্তী অনুচ্ছেদে কোনও ইতরূপকরণের মতো কাজ না করার জন্য আন্ডারস্কোর পেতে পারি না। কেউ যদি কীভাবে এটি ঠিক করতে জানেন তবে দয়া করে এই উত্তরটি সম্পাদনা করতে দ্বিধা বোধ করবেন।


আপনি যদি সীমাবদ্ধতাগুলি সরিয়ে ফেলার পরিবর্তে অক্ষম করতে চান তবে কেবল উপরের নির্বাচনী বয়ানটি সম্পাদনা করুন: 'নিষ্ক্রিয় সীমাবদ্ধতা' এইচটিএইচ: ও) পড়ার জন্য 'বাধা ছাড়ুন'
অ্যান্ড্রু

হ্যাঁ, এটি একটি ভাল পরামর্শ - ভবিষ্যতে এই তথ্য যুক্ত করতে পোস্টটি নির্দ্বিধায় স্বাচ্ছন্দ্য বোধ করবেন। এজন্য আমার পোস্টগুলি সম্প্রদায়ের উইকি হিসাবে সম্পাদনাযোগ্য have
মাইক ম্যাকএলিস্টার

5

সমস্ত সীমাবদ্ধতা অক্ষম করতে নিম্নলিখিত কার্সার ব্যবহার করুন .. এবং সীমাবদ্ধতা সক্ষম করার জন্য ক্যোয়ারী পরিবর্তন করুন ...

DECLARE

cursor r1 is select * from user_constraints;
cursor r2 is select * from user_tables;

BEGIN
  FOR c1 IN r1
  loop
    for c2 in r2
    loop
       if c1.table_name = c2.table_name and c1.status = 'ENABLED' THEN
        dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' disable constraint ' || c1.constraint_name);
       end if;
    end loop;
  END LOOP;
END;
/

4

এটি পিএল / এসকিউএল এ স্ক্রিপ্ট করা যায় কেবল ডিবিএ / সমস্ত / ইউএসER_CONSTRAINTS সিস্টেম ভিউয়ের উপর ভিত্তি করে, তবে বিভিন্ন বিবরণ ততটা তুচ্ছ বলে মনে হয় না। এটি যে ক্রমটি সম্পন্ন হয়েছে সে সম্পর্কে আপনাকে সতর্কতা অবলম্বন করতে হবে এবং আপনাকে অনন্য সূচকের উপস্থিতি সম্পর্কেও বিবেচনা করতে হবে।

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


0

দেখে মনে হচ্ছে আপনি একক আদেশ দিয়ে এটি করতে পারবেন না, তবে এখানে এটিই সবচেয়ে কাছের জিনিস যা আমি খুঁজে পেতে পারি।


0

সীমাবদ্ধতাগুলি অক্ষম করার জন্য এটি অন্য একটি উপায় (এটি https://asktom.oracle.com/pls/asktom/f?p=100:11ferences402577774283132:::::::11: কিউইএসটিএন_আইডিএইচএসআইএইটিওএসআইএন_আইডি 3999218963817 )

WITH qry0 AS
       (SELECT    'ALTER TABLE '
               || child_tname
               || ' DISABLE CONSTRAINT '
               || child_cons_name
                 disable_fk
              ,   'ALTER TABLE '
               || parent_tname
               || ' DISABLE CONSTRAINT '
               || parent.parent_cons_name
                 disable_pk
          FROM (SELECT a.table_name child_tname
                      ,a.constraint_name child_cons_name
                      ,b.r_constraint_name parent_cons_name
                      ,LISTAGG ( column_name, ',') WITHIN GROUP (ORDER BY position) child_columns
                  FROM user_cons_columns a
                      ,user_constraints b
                 WHERE a.constraint_name = b.constraint_name AND b.constraint_type = 'R'
                GROUP BY a.table_name, a.constraint_name
                        ,b.r_constraint_name) child
              ,(SELECT a.constraint_name parent_cons_name
                      ,a.table_name parent_tname
                      ,LISTAGG ( column_name, ',') WITHIN GROUP (ORDER BY position) parent_columns
                  FROM user_cons_columns a
                      ,user_constraints b
                 WHERE a.constraint_name = b.constraint_name AND b.constraint_type IN ('P', 'U')
                GROUP BY a.table_name, a.constraint_name) parent
         WHERE child.parent_cons_name = parent.parent_cons_name
           AND (parent.parent_tname LIKE 'V2_%' OR child.child_tname LIKE 'V2_%'))
SELECT DISTINCT disable_pk
  FROM qry0
UNION
SELECT DISTINCT disable_fk
  FROM qry0;

একটি যাদুমন্ত্র মত কাজ করে


0

"অক্ষম করুন" স্ক্রিপ্টে, ধারা দ্বারা আদেশটি এমন হওয়া উচিত:

ORDER BY c.constraint_type DESC, c.last_change DESC

এই ধারাটির লক্ষ্যটি সঠিক ক্রমে সীমাবদ্ধতাগুলি অক্ষম করে।


0
SELECT 'ALTER TABLE '||substr(c.table_name,1,35)|| 
' DISABLE CONSTRAINT '||constraint_name||' ;' 
FROM user_constraints c, user_tables u 
WHERE c.table_name = u.table_name; 

এই বিবৃতিটি কমান্ডগুলি দেয় যা প্রাথমিক কী, বিদেশী কী এবং অন্য সীমাবদ্ধতা সহ সমস্ত বাধা বন্ধ করে দেয়।


0

লুপের জন্য কার্সার সহ (ব্যবহারকারী = 'ট্রানিজি', টেবিল = 'ডি')

declare
    constr all_constraints.constraint_name%TYPE;
begin
    for constr in
        (select constraint_name from all_constraints
        where table_name = 'D'
        and owner = 'TRANEE')
    loop
        execute immediate 'alter table D disable constraint '||constr.constraint_name;
    end loop;
end;
/

(আপনি যদি সক্ষম করতে অক্ষম পরিবর্তন করেন তবে আপনি সমস্ত বাধা সক্ষম করতে পারবেন)


0

নিম্নলিখিত কোয়েরি দ্বারা ফিরে আসা সমস্ত আদেশ আপনি কার্যকর করতে পারেন:

'ALTER TABLE' || সাবস্ট্রাস্ট (সি। টেবিল_নাম, 1,35) নির্বাচন করুন || 'অক্ষম নিয়ন্ত্রণ' || বাধা_নাম || ' ; ' ব্যবহারকারীর_কন্ট্রেন্টস থেকে সি - কোথাও c.table_name = 'TABLE_NAME';

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.