2

我可以使用 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 | 加入表 2 的列

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

4

3 回答 3

3

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

如果您没有数据模型,那么您可以从数据字典中逆向工程。请参阅我对逆向工程问题的回答。

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

“我有 800 个表,我无法全部选中来跟踪路径。”

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

于 2012-07-10T14:48:00.753 回答
2

If primary and foreign key relationships are established in the database, you can use a tool like Oracle Developer with Data Modeler to reverse engineer the model and give a graphical representation of what the relationships are.

Tools like this read the Oracle dictionary to determine the relationships between tables. You can do this yourself by querying views such as sys.all_constraints.

I cobbled the following query together using Tim Hall's Generic Function Using a Ref Cursor, since I only have 10g here (you can use 11g's LISTAGG function if you've got 11g). It should get you close.

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';
于 2012-07-10T14:41:57.747 回答
0

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

于 2012-07-10T14:44:09.727 回答