Linux公社论坛

 找回密码
 注册
查看: 439|回复: 0

[问题解决] ORA-02266错误的批量生成脚本解决方案

[复制链接]

391

主题

6

听众

1020

积分

超级版主

Rank: 8Rank: 8

Rh08 发表于 2019-2-25 23:10:39 |显示全部楼层
最近导数时使用TRUNCATE清理主表数据又遇到了这个错误,发现有解决方案:

a) 禁用与主表相关的外键约束

b) TRUNCATE TABLE

c) 启用那些外键约束。


在实际操作中,发现使用上面的流程操作虽然正确,但是要写很多脚本,有些主表中的字段可能是多个表的外键约束。那么我们必须写多个脚本,那么我们必须使用脚本批量生成。

快速解决问题,具体如下所示:。


--生成禁用约束的脚本,解决ORA-02266: unique/primary keys in table referenced by enabled foreign keys


SELECT DC.OWNER           AS "PARENT_TABLE_OWNER",
       DC.TABLE_NAME      AS "PARENT_TABLE_NAME",
       DC.CONSTRAINT_NAME AS "PRIMARY CONSTRAINT NAME",
       DF.CONSTRAINT_NAME AS "REFERENCED CONSTRAINT NAME",
       DF.OWNER           AS "CHILD_TABLE_OWNER",
       DF.TABLE_NAME      AS "CHILD_TABLE_NAME" ,
       'ALTER TABLE ' || DF.OWNER  || '.' || DF.TABLE_NAME || ' DISABLE CONSTRAINT ' || DF.CONSTRAINT_NAME || ';'
FROM   DBA_CONSTRAINTS DC,
       (SELECT C.OWNER,
               C.CONSTRAINT_NAME,
               C.R_CONSTRAINT_NAME,
               C.TABLE_NAME
        FROM   DBA_CONSTRAINTS C
        WHERE  CONSTRAINT_TYPE = 'R') DF
WHERE  DC.CONSTRAINT_NAME = DF.R_CONSTRAINT_NAME
       AND DC.OWNER =UPPER('&OWNER')
       AND DC.TABLE_NAME=UPPER('&TABLE_NAME');


--生成启用约束的脚本,解决ORA-02266: unique/primary keys in table referenced by enabled foreign keys


SELECT DC.OWNER           AS "PARENT_TABLE_OWNER",
       DC.TABLE_NAME      AS "PARENT_TABLE_NAME",
       DC.CONSTRAINT_NAME AS "PRIMARY CONSTRAINT NAME",
       DF.CONSTRAINT_NAME AS "REFERENCED CONSTRAINT NAME",
       DF.OWNER           AS "CHILD_TABLE_OWNER",
       DF.TABLE_NAME      AS "CHILD_TABLE_NAME" ,
       'ALTER TABLE ' || DF.OWNER  || '.' || DF.TABLE_NAME || ' ENABLE CONSTRAINT ' || DF.CONSTRAINT_NAME || ';'
FROM   DBA_CONSTRAINTS DC,
       (SELECT C.OWNER,
               C.CONSTRAINT_NAME,
               C.R_CONSTRAINT_NAME,
               C.TABLE_NAME
        FROM   DBA_CONSTRAINTS C
        WHERE  CONSTRAINT_TYPE = 'R') DF
WHERE  DC.CONSTRAINT_NAME = DF.R_CONSTRAINT_NAME
       AND DC.OWNER =UPPER('&OWNER')
       AND DC.TABLE_NAME=UPPER('&TABLE_NAME');


原因分析:对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,因为TRUNCATE不会触发触发器,不会去验证任何约束。所以语法上是不允许的:有外键约束的表只能用DELETE删除数据,不能用TRUNCATE删除数据。
您需要登录后才可以回帖 登录 | 注册

关注Linux公社官方微信,免费领取邀请码。

手机版|Linux公社(LinuxIDC.com)旗下网站【www.linuxidc.net】

GMT+8, 2019-7-24 03:43 , Processed in 0.034002 second(s), 7 queries , Wincache On.

Powered by Discuz! X 3.2

© 2010-2016 Comsenz Inc.

回顶部