跟踪Oracle表之间的路径?

时间:2012-07-10 14:33:37

标签: oracle join

我可以使用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 | JoinCollumnofTable1 | JoinCollumnofTable2

为了得到这个,我推测另一个表加入 ALL_CONSTRAINTS ALL_CON_COLUMNS 但我发现的问题是复合的primary_keys。

3 个答案:

答案 0 :(得分:3)

这就是为什么大自然给了我们数据模型:协助这样的任务。

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

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

  

“我有800个桌子,我无法全部选择它们来追踪路径。”

嗯,我想建议你对数据模型进行逆向工程,这有点像关于如何到达科克的老笑话的妙语:“好吧,我不会从这里开始”。关于预先建立数据模型的重点是,当我们真正需要它时,我们就拥有它。

答案 1 :(得分:2)

如果在数据库中建立了主键和外键关系,则可以使用Oracle Developer with 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';

答案 2 :(得分:0)

另外尝试schemaspy - 一个开源免费替代方案,它使用外键生成关系模型!