2010-06-29 1 views
8

DBMS_METADATA를 사용하여 주어진 스키마에 대해 DDL을 추출하는 데 어려움이 있습니다.DBMS_METADATA (및 SCHEMA_EXPORT)를 사용하여 Oracle SCHEMA를 DDL 스크립트로 가져 오는 방법

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_CONSTRAINTCONSTRAINTS_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); 

그래서 내가 항상 성취 할 수있는 것은 아니기 때문에, 개체를 종속 순서로 넣지 않아도된다는 결론을 내렸는지 이해할 수있었습니다.

이와 같이 테이블을 만들 때 참조 제한 조건을 그대로두고 모든 테이블을 만든 후에 ALTER로 적용합니다.

+0

예, 원형 참조를 알고 있으며 한 번에 테이블을 만들지 못하게합니다. 그러나이 문서를 이해하는 한, 이것은'REF_CONSTRAINT'를 false로,'CONSTRAINTS_AS_ALTER'를 참으로 설정하는 이유입니다. 그래서 참조 제약 조건은'create table' 문의 부분이 아니라 나중에'alter table ... 제약 ... 외래 키'진술. –

관련 문제