昨天同事遇到一个有关约束的问题. 其他同事设置了2个数据库,其中一个是从另外一个exp/imp的,但不知什么原因,
现在2个数据库的用户下表的约束存在很多不同. 他就问我有什么方法将原库的约束导出来,然后重新在新的数据库中
建立. 当然最简单的方法是使用exp重新导出原来数据库的结构信息,然后导入新数据库就可以了.
问题是他的客户端是11g,而数据库是10g,而且他工作的机器没有pl/sql developer.
首先想到使用sql查询dba_constraints来生成所需要的东西比较麻烦,能否用dbms_metadata包中提供的过程来获取,
get_ddl只是获取表的ddl定义,当然也包含了约束,但不是单独的约束,查了一下手册,dbms_metadata.GET_DEPENDENT_DDL
可以获取我们需要的信息. 实验表明方法可行,记录下来供以后参考.
处理主键,唯一和检查约束
SELECT dbms_metadata.GET_DEPENDENT_DDL('CONSTRAINT',table_name,owner)
FROM dba_constraints a
where a.owner='XXXX'
and a.constraint_type not in ('R','?','O')
group by a.owner,a.table_name;
处理外键约束.
SELECT dbms_metadata.GET_DEPENDENT_DDL('REF_CONSTRAINT',table_name,owner)
FROM dba_constraints a
where a.owner= 'XXXX'
and a.constraint_type='R'
group by a.owner,a.table_name;
当时有趣的是同事开始运行时说报错,提示对应的CONSTRAINT类型不存在,
按照我这里的试验告诉他这个错误表示对应的表上不存在此约束,
进一步检查,竟然发现约束的类型存在?和O,我也很惊奇,在我的记忆里约束类型仅有P,U,C,R
四种类型, ?和O是什么.连到一个数据库中,一看?和O对应的表,猜测与高级队列有关.
所以修改来查询语句将这种情况排除在外.