Tôi đang gặp khó khăn để trích xuất DDL cho một lược đồ đã cho bằng DBMS_METADATA, có lẽ vì sự hiểu biết của tôi về nó là sai.Làm thế nào để có được một SCHEMA Oracle như các kịch bản DDL với DBMS_METADATA (và SCHEMA_EXPORT)
Dưới đây là những gì tôi về cơ bản làm:
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
Tôi đã theo ấn tượng rằng phương pháp này sẽ quay trở lại những điều khoản về "CREATE TABLE" để sao cho chúng có thể được tạo ra, có nghĩa là, bảng phụ thuộc sẽ được phát ra một lát sau.
Tuy nhiên, hóa ra thứ tự của các bảng là tùy ý ở chỗ một số bảng được phát ra với ràng buộc khóa ngoài tham chiếu đến bảng chưa được phát ra.
Để "giải quyết" vấn đề này, tôi đặt số REF_CONSTRAINT
và CONSTRAINTS_AS_ALTER
thành sai và đúng, vì tôi cho rằng điều này sẽ làm cho sự cố của tôi biến mất. Đó không phải là trường hợp.
Vì vậy, có một vấn đề xung quanh vấn đề của tôi hay có một cài đặt mà tôi bỏ qua không?
Câu hỏi hay. Rất mong nhận được câu trả lời. – Rene