【问题标题】:Trace a path between Oracle tables?跟踪 Oracle 表之间的路径?
【发布时间】:2012-07-10 14:33:36
【问题描述】:

我可以使用 Oracle sys 表来跟踪两个表之间的路径,从 X 表到 Y 表的所有可能性。 问题是: 我在一个巨大的数据库上工作,很难快速知道哪些表对于在两个表之间建立连接至关重要。 我可以这样做吗?

第一需求:

SQL Developer Data Modeler 和其他工具的问题是必须选择表来 rev_eng(所以我应该已经知道要选择的表)但对我来说,这是主要问题。在我的情况下,我有 800 个表,我不能全部选择它们来跟踪路径。我的愿望是提交两个表作为参数,然后生成所有可能的路径。

第二需求:

我已经尝试查询 sys.all_constraints 并且我所做的最大值是检测直接连接到表 X 的表。 查询:

SELECT C1.TABLE_NAME,C2.TABLE_NAME 
FROM ALL_CONSTRAINTS C1, ALL_CONSTRAINTS C2 
WHERE C2.CONSTRAINT_NAME = C1.R_CONSTRAINT_NAME
AND UPPER(C1.OWNER) LIKE '**MY_SCHEMA**'
AND C1.CONSTRAINT_TYPE='R' 
AND UPPER(C1.TABLE_NAME) LIKE '**X**'
ORDER BY C1.TABLE_NAME

因此,如果有人可以帮助我至少构思查询以获得此结果:

表 1 |表2 |加入CollumnofTable1 | JoinCollumnofTable2

为此,我推测要加入 ALL_CONSTRAINTS 的另一个表是 ALL_CON_COLUMNS 但我发现的问题是复合主键。

【问题讨论】:

标签: oracle join


【解决方案1】:

这就是 Nature 为我们提供数据模型的原因:协助完成此类任务。

如果您没有数据模型,则可以从数据字典中逆向工程。请参阅我对a question on reverse engineering 的回复。

逆向工程只能识别由外键定义的关系。这不需要说明,但无论如何都要说出来:如果您的数据库没有约束,那么您没有机会自动派生数据模型。

“我有 800 个表,我不能全选来追踪路径。”

嗯,我想建议您对数据模型进行逆向工程有点像关于如何到达 Cork 的老笑话:“我不会从这里开始”。预先拥有一个数据模型的全部意义在于,当我们真正需要它时,我们就会拥有它。

【讨论】:

  • 你能看一下我这篇文章的最后一版吗,非常感谢你的回答!
【解决方案2】:

如果在数据库中建立了主键和外键关系,您可以使用 Oracle Developer 和 Data Modeler 之类的工具对模型进行逆向工程,并以图形表示关系是什么。

这样的工具会读取 Oracle 字典以确定表之间的关系。您可以通过查询诸如 sys.all_constraints 之类的视图自行完成。

我使用Tim Hall's Generic Function Using a Ref Cursor 将以下查询拼凑在一起,因为我这里只有 10g(如果你有 11g,你可以使用 11g 的 LISTAGG 函数)。它应该能让你接近。

SELECT ac1.table_name "Table", ac2.table_name "Referencing Table"
     , concatenate_list(CURSOR(SELECT acc.column_name 
                                 FROM all_cons_columns acc 
                                WHERE acc.constraint_name = ac1.constraint_name
                                  AND acc.owner = 'the_owner'
                                ORDER BY position)) "PK Columns"
     , concatenate_list(CURSOR(SELECT acc.column_name 
                                 FROM all_cons_columns acc 
                                WHERE acc.constraint_name = ac2.constraint_name
                                  AND acc.owner = 'the_owner'
                                ORDER BY position)) "FK Columns"
  FROM all_constraints ac1 JOIN all_constraints ac2 
                             ON ac1.constraint_name = ac2.r_constraint_name
 WHERE ac1.table_name = 'your_table'
   AND ac1.owner = 'the_owner'
   AND ac2.owner = 'the_owner'
   AND ac1.constraint_type = 'P';

【讨论】:

  • 你能看一下我这篇文章的最后一版吗,非常感谢你的回答!
【解决方案3】:

还可以尝试 schemaspy - 一种免费的开源替代方案,它使用外键生成关系模型!

【讨论】:

  • 你能看一下我这篇文章的最后一版吗,非常感谢你的回答!
  • 很棒的工具,最适合我的情况。关键是您可以在参数中提供一个表格以获取特定信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
相关资源
最近更新 更多