获取表约束的DDL语句

         昨天同事遇到一个有关约束的问题. 其他同事设置了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对应的表,猜测与高级队列有关.

所以修改来查询语句将这种情况排除在外.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值