gpt4 book ai didi

oracle - 如何使用 DBMS_METADATA(和 SCHEMA_EXPORT)将 Oracle SCHEMA 作为 DDL 脚本获取

转载 作者:行者123 更新时间:2023-12-04 08:53:36 27 4
gpt4 key购买 nike

我在使用 DBMS_METADATA 提取给定模式的 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

我的印象是,此方法将按照可以创建它们的顺序返回“CREATE TABLE”语句,也就是说,稍后会发出依赖表。

然而,事实证明,表的顺序是任意的,因为某些表是使用外键约束发出的,该约束引用了尚未发出的表。

为了“解决”这个问题,我设置了 REF_CONSTRAINTCONSTRAINTS_AS_ALTER分别为 false 和 true,因为我认为这会让我的问题消失。事实并非如此。

那么,是否有解决我的问题的方法,或者是否存在我忽略的设置?

最佳答案

与其说是观察,不如说是答案。
在约束中使用循环引用在技术上是可能的(但在实践中可能很愚蠢)。

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 应用。

关于oracle - 如何使用 DBMS_METADATA(和 SCHEMA_EXPORT)将 Oracle SCHEMA 作为 DDL 脚本获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3138619/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com