2010-06-29 5 views
8

के साथ डीडीएल स्क्रिप्ट के रूप में कैसे प्राप्त करूं, मुझे डीबीएमएस_एमटीएडीएटीएए के साथ दिए गए स्कीमा के लिए डीडीएल निकालने में परेशानी हो रही है, शायद इसलिए कि मेरी समझ गलत है।मैं ओबीकल स्कीमा को डीबीएमएस_एमटीएडीएटीए (और SCHEMA_EXPORT)

set termout off 

create table copy_dml_schema(c clob, i number); 

declare 

    m number; 
    t number; 
    e number; 
    c clob; 
    i number := 0; 

begin 

    e := dbms_metadata.session_transform; 


    dbms_metadata.set_transform_param (e, 'REF_CONSTRAINTS'  , false ); 
    dbms_metadata.set_transform_param (e, 'CONSTRAINTS_AS_ALTER', true ); 
    dbms_metadata.set_transform_param (e, 'CONSTRAINTS'   , true ); 
    dbms_metadata.set_transform_param (e, 'FORCE'    , true ); 


    m := dbms_metadata.open('SCHEMA_EXPORT'); 
    t := dbms_metadata.add_transform (m, 'DDL'     ); 

    dbms_metadata.set_transform_param (t, 'PRETTY'    , true ); 
    dbms_metadata.set_transform_param (t, 'SQLTERMINATOR'  , true ); 

    dbms_metadata.set_filter   (m, 'SCHEMA'    , 'XYZ'); 
    dbms_metadata.set_filter   (m, 'EXCLUDE_PATH_EXPR' , 'in (' || 
              '''GRANT''   ,' || 
              '''SYNONYM''  ,' || 
              '''STATISTICS''  ,' || 
              '''COMMENT''   ' || 
              ')'); 


    loop 
    c := dbms_metadata.fetch_clob(m); 
    exit when c is null; 
    insert into copy_dml_schema values (c, i); 
    i := i+1; 
    end loop; 

    dbms_metadata.close(m); 

end; 
/

commit; 


set pages  0 
set trimspool on 
set long  1000000 
set lines   300 
set longchunksize 300 


spool c:\temp\the_schema.sql 

select 
    c 
from 
    copy_dml_schema 
order 
    by i; 

spool off 

drop table copy_dml_schema; 

set termout on 

मैं यह धारणा थी कि इस विधि में इस तरह के आदेश है कि वे बनाया जा सकता है में "टेबल बनाएं" बयान वापस होगा, कि है, निर्भर टेबल उत्सर्जित किया जाएगा:

यहाँ क्या मैं मूल रूप से करते हैं बाद में।

हालांकि, यह पता चला है कि तालिकाओं का क्रम मनमाने ढंग से है कि कुछ तालिकाओं को एक विदेशी कुंजी बाधा के साथ उत्सर्जित किया जाता है जो उत्सर्जित नहीं होने वाली तालिका को संदर्भित करता है।

इस समस्या को हल करने के लिए, मैंने REF_CONSTRAINT और CONSTRAINTS_AS_ALTER क्रमशः झूठी और सत्य के लिए सेट किया है, क्योंकि मुझे लगता है कि इससे मेरी समस्या दूर हो जाएगी। जो मामला नहीं है।

तो, क्या मेरी समस्या के आसपास कोई काम है, या क्या ऐसी सेटिंग है जिसे मैंने अनदेखा किया है?

+0

अच्छा सवाल। उत्तर के लिए तत्पर हैं। – Rene

उत्तर

1

एक अवलोकन के रूप में इतना जवाब नहीं है। बाधाओं में परिपत्र संदर्भ होने के लिए यह तकनीकी रूप से संभव है (लेकिन संभवतः अभ्यास में डाफ्ट)।

create table blue (blue_id number primary key, val varchar2(10), red_id number); 
create table red (red_id number primary key, val varchar2(10), blue_id number); 

insert into blue values (1,'test',2); 
insert into red values (2,'test',1); 

alter table blue add constraint blue_fk foreign key (red_id) references red (red_id); 
alter table red add constraint red_fk foreign key (blue_id) references blue (blue_id); 

तो मैं समझता हूँ कि अगर वे फैसला किया है कि, क्योंकि यह जरूरी हमेशा प्राप्त नहीं है, वे निर्भरता क्रम में वस्तुओं डाल परेशान नहीं होगा सकता है।

इस प्रकार, जब टेबल बनाए जा रहे हैं, तो मैं रेफरेंशियल बाधाओं को छोड़ दूंगा, फिर सभी तालिकाओं के निर्माण के बाद उन्हें ALTERs के रूप में लागू करें।

+0

हां, मैं परिपत्र संदर्भों से अवगत हूं, और वे एक ही समय में तालिकाओं के निर्माण को प्रतिबंधित करेंगे। लेकिन जहां तक ​​मैं प्रलेखन को समझता हूं, वही है कि 'REF_CONSTRAINT' को गलत और' CONSTRAINTS_AS_ALTER' को सत्य में सेट करने का कारण है ताकि संदर्भित बाधाओं को 'तालिका बनाएं' कथन का हिस्सा नहीं बनाया गया हो लेकिन बाद में पृथक 'तालिका बदलें ... बाधा ... विदेशी कुंजी 'कथन। –

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