我可以使用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。
答案 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 - 一个开源免费替代方案,它使用外键生成关系模型!