问题描述
为了查找数据库表依赖关系,我在sql下面运行,
选择rpad ( '*', (级别-1 ) *2, '*') || table_name table_name
来自(
选择p.table_name
, p.Constraint_name主要约束条件
, f.Constraint_name外部约束
, f.r_Constraint_name外键名称
来自user_Constraints p
, user_Constraints f
其中p.table_name = f.table_name
和p.Constraint_type ='P'
和f.Constraint_type ='R'
联合
选择table_name
,约束名称
,空
,空
来自user_Constraints
其中约束类型='P'
)
开头为.h.d.d.d.d.d.d.d.d.d.
通过前一个主连接=外键名称连接;
引发错误:执行请求的操作时遇到错误:
ORA-01436 :用户数据中的连接BY循环
01436。00000 -“用户数据中的连接循环”
*原因:
*行动:
供应商代码1436
请您帮助修改此查询。。
选择rpad ( '*', (级别-1 ) *2, '*') || table_name table_name
来自(
选择p.table_name
, p.Constraint_name主要约束条件
, f.Constraint_name外部约束
, f.r_Constraint_name外键名称
来自user_Constraints p
, user_Constraints f
其中p.table_name = f.table_name
和p.Constraint_type ='P'
和f.Constraint_type ='R'
联合
选择table_name
,约束名称
,空
,空
来自user_Constraints
其中约束类型='P'
)
开头为.h.d.d.d.d.d.d.d.d.d.
通过前一个主连接=外键名称连接;
引发错误:执行请求的操作时遇到错误:
ORA-01436 :用户数据中的连接BY循环
01436。00000 -“用户数据中的连接循环”
*原因:
*行动:
供应商代码1436
请您帮助修改此查询。。
专家解答
你的外键在某处有一个循环!如果它是返回到同一表的FK ,则可以通过检查上一个表<>是否为“preor table_name <> table_name”的当前表来避免此问题:
如果你的关系中有一个更大的循环,你可以用“nocyle”关键字来欺骗自己。
create table t (
x int primary key,
y int references t(x)
);
select s.*,
rpad ( '*', ( level-1 ) *2, '*' ) || table_name table_name
from
(select p.table_name , p.constraint_name primary_cons ,
f.constraint_name foreign_cons ,
f.r_constraint_name foreign_key_name
from user_constraints p , user_constraints f
where p.table_name = f.table_name
and p.constraint_type = 'P'
and f.constraint_type = 'R'
union
select table_name , constraint_name , null ,
null
from user_constraints
where constraint_type = 'P'
) s
start with foreign_cons is null
connect by prior primary_cons = foreign_key_name;
SQL Error: ORA-01436: CONNECT BY loop in user data
select s.*,
rpad ( '*', ( level-1 ) *2, '*' ) || table_name table_name
from
(select p.table_name , p.constraint_name primary_cons ,
f.constraint_name foreign_cons ,
f.r_constraint_name foreign_key_name
from user_constraints p , user_constraints f
where p.table_name = f.table_name
and p.constraint_type = 'P'
and f.constraint_type = 'R'
union
select table_name , constraint_name , null ,
null
from user_constraints
where constraint_type = 'P'
) s
start with foreign_cons is null
connect by prior primary_cons = foreign_key_name
and prior table_name <> table_name;
TABLE_NAME PRIMARY_CONS FOREIGN_CONS FOREIGN_KEY_NAME TABLE_NAME
T SYS_C005783 T
如果你的关系中有一个更大的循环,你可以用“nocyle”关键字来欺骗自己。
drop table t purge;
create table t (
x int primary key,
y int
);
create table t1 (
x int primary key,
y int references t(x)
);
alter table t add constraint fk foreign key (y) references t1(x);
select s.*,
rpad ( '*', ( level-1 ) *2, '*' ) || table_name table_name
from
(select p.table_name , p.constraint_name primary_cons ,
f.constraint_name foreign_cons ,
f.r_constraint_name foreign_key_name
from user_constraints p , user_constraints f
where p.table_name = f.table_name
and p.constraint_type = 'P'
and f.constraint_type = 'R'
union
select table_name , constraint_name , null ,
null
from user_constraints
where constraint_type = 'P'
) s
start with foreign_cons is null
connect by nocycle prior primary_cons = foreign_key_name
and prior table_name <> table_name;
TABLE_NAME PRIMARY_CONS FOREIGN_CONS FOREIGN_KEY_NAME TABLE_NAME
T SYS_C005797 T
T1 SYS_C005798 SYS_C005799 SYS_C005797 **T1
T1 SYS_C005798 T1
T SYS_C005797 FK SYS_C005798 **T
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




