暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 表依赖关系

askTom 2016-11-08
269

问题描述

为了查找数据库表依赖关系,我在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

请您帮助修改此查询。。

专家解答

你的外键在某处有一个循环!如果它是返回到同一表的FK ,则可以通过检查上一个表<>是否为“preor table_name <> table_name”的当前表来避免此问题:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论