जवाबों:
अस्थायी स्पूल फ़ाइलों को लिखने से बचना बेहतर है। PL / SQL ब्लॉक का उपयोग करें। आप इसे SQL * Plus से चला सकते हैं या इस चीज़ को पैकेज या प्रक्रिया में डाल सकते हैं। दृश्य बाधाओं से बचने के लिए USER_TABLES में शामिल होना है।
यह संभावना नहीं है कि आप वास्तव में सभी बाधाओं (जिसमें NULL, प्राथमिक कुंजियाँ, आदि शामिल नहीं हैं) को अक्षम करना चाहते हैं। आपको WHERE क्लॉज में constraint_type लगाने के बारे में सोचना चाहिए।
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;
/
बाधाओं को फिर से सक्षम करना थोड़ा मुश्किल है - आपको विदेशी कुंजी बाधा में उन्हें संदर्भित करने से पहले प्राथमिक कुंजी बाधाओं को सक्षम करने की आवश्यकता है। यह constraint_type पर ORDER BY का उपयोग करके किया जा सकता है। 'P' = प्राथमिक कुंजी, 'R' = विदेशी कुंजी।
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;
/
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
पहले कोड सेगमेंट में जोड़कर आप इन्हें संभाल सकते हैं ।
बाधाओं के बीच निर्भरता की गणना करने के लिए:
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;
/
यह एक आदेश नहीं है, लेकिन यहां मैं इसे कैसे करता हूं। निम्न स्क्रिप्ट को SQL * प्लस में चलाने के लिए डिज़ाइन किया गया है। ध्यान दें, मैंने जानबूझकर इसे केवल वर्तमान स्कीमा के भीतर काम करने के लिए लिखा है।
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
जो आप छोड़ते हैं, उसे प्रतिबंधित करने के लिए, चयन कथन में एक क्लॉज़ जोड़कर फ़िल्टर करें: -
वर्तमान स्कीमा से अधिक पर चलने के लिए, user_constraints के बजाय all_constraints से चयन करने के लिए कथन को संशोधित करें।
नोट - किसी कारण से मैं पिछले पैराग्राफ में इटैलिकाइजेशन की तरह काम करने के लिए अंडरस्कोर नहीं पा सकता हूं। यदि कोई इसे ठीक करना जानता है, तो कृपया इस उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें।
सभी अवरोधों को निष्क्रिय करने के लिए निम्नलिखित कर्सर का उपयोग करें .. और सक्षम बाधाओं के लिए क्वेरी में परिवर्तन करें ...
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;
/
यह PL / SQL में डीबीए / ALL / USER_CONSTRAINTS सिस्टम दृश्य के आधार पर सुंदर रूप से लिपिबद्ध किया जा सकता है, लेकिन विभिन्न विवरण उतने ही तुच्छ नहीं हैं जितना लगता है। आपको उस आदेश के बारे में सावधान रहना होगा जिसमें यह किया गया है और आपको अद्वितीय अनुक्रमित की उपस्थिति का भी ध्यान रखना होगा।
यह आदेश महत्वपूर्ण है क्योंकि आप एक अद्वितीय या प्राथमिक कुंजी को नहीं छोड़ सकते हैं जिसे एक विदेशी कुंजी द्वारा संदर्भित किया जाता है, और अन्य स्कीमाओं में तालिकाओं पर विदेशी कुंजी हो सकती है जो प्राथमिक कुंजी को अपने आप में संदर्भित करती हैं, इसलिए जब तक कि आपके पास कोई विशेष विशेषाधिकार नहीं है तब तक आप उन पीके और यूके को नहीं छोड़ सकते। इसके अलावा, आप एक अनूठे इंडेक्स को एक गैर-अद्वितीय इंडेक्स होने के लिए स्विच नहीं कर सकते हैं ताकि आपको बाधा को छोड़ने के लिए इसे छोड़ना पड़े (इस कारण से यह अद्वितीय बाधाओं को "वास्तविक" बाधा के रूप में लागू करने के लिए लगभग हमेशा बेहतर होता है जो गैर द्वारा समर्थित है -सूचक सूचकांक)।
ऐसा नहीं लगता है कि आप एक ही आदेश के साथ ऐसा कर सकते हैं, लेकिन यहां यह निकटतम चीज है जो मुझे मिल सकती है।
यह बाधाओं को अक्षम करने का एक और तरीका है (यह https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132:::::P11_QUESTION-ID:399218963817 पर आया है )
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;
एक जादू की तरह काम करता है
"अक्षम" स्क्रिप्ट में, क्लॉज द्वारा आदेश यह होना चाहिए:
ORDER BY c.constraint_type DESC, c.last_change DESC
इस खंड का लक्ष्य सही क्रम में बाधाओं को अक्षम करना है।
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;
यह कथन उन कमांड को लौटाता है जो प्राथमिक कुंजी, विदेशी कुंजी और अन्य बाधाओं सहित सभी बाधाओं को बंद कर देते हैं।
लूप के लिए कर्सर (उपयोगकर्ता = 'TRANEE', तालिका = 'D')
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;
/
(यदि आप सक्षम करने के लिए अक्षम बदलते हैं, तो आप सभी बाधाओं को सक्षम कर सकते हैं)
आप निम्नलिखित क्वेरी द्वारा दिए गए सभी आदेशों को निष्पादित कर सकते हैं:
'ALTER TABLE' का चयन करें। पदार्थ (c.table_name, 1,35) || 'DIS DIS CONSTRAINT ’|| constraint_name || ; ' user_constraints c --where c.table_name = 'TABLE_NAME' से;