1

Oracle 是否有可用于分析数据库并帮助确定可能缺失的字段关系的工具?我们有一个包含 150 多个表的旧数据库,并且缺少许多关系。我们可以手动完成,但自动化工具可能有用。所以找到诸如缺少外键之类的东西。

4

3 回答 3

2

我现在不得不这样做几次。我发现这是一种非常人性化的事情——通过在数据字典中运行大量查询(例如 EvilTeach 的查询)、从列中查询示例数据、检查应用程序如何创建数据以及理解业务需求和用户流程。

例如,在许多遗留应用程序中,我发现在前端应用程序中检查和实现的约束(包括引用完整性约束),这意味着数据遵循约束(几乎 100% :))但它实际上并没有在数据库中受到约束等级。很多有趣的结果。

如果一个工具可以自动完成任何这些并产生有用的结果,我会感到惊讶。

于 2010-09-29T03:16:00.460 回答
1

这可能是一个好的开始

select column_name, table_name, data_type
from user_tab_cols
order by column_name, table_name
于 2010-09-28T18:44:57.977 回答
1

如果您假设您可以通过在不同表中查找具有相同名称和数据类型的列来识别可能的外键关系,您可以找到可能的外键缺失,其中一个是主键,另一个没有引用该键.

您可以使用这样的查询:

select c1.TABLE_NAME, c1.COLUMN_NAME, c2.TABLE_NAME, c2.COLUMN_NAME
  from user_tab_columns c1,
       user_tables      at1,
       user_tab_columns c2,
       user_tables      at2
 where c1.COLUMN_NAME = c2.COLUMN_NAME
   and c1.DATA_TYPE = c2.DATA_TYPE
   and c1.TABLE_NAME = at1.TABLE_NAME
   and c2.TABLE_NAME = at2.TABLE_NAME
   and c1.TABLE_NAME != c2.TABLE_NAME
   /*and c1.TABLE_NAME = 'TABLE' --check this for one table
     and c1.COLUMN_NAME = 'TABLE_PK'*/
   and not exists (select 1
          from user_cons_columns ucc,
               user_constraints  uc,
               user_constraints  uc2,
               user_cons_columns ucc2
         where ucc.CONSTRAINT_NAME = uc.CONSTRAINT_NAME
           and uc.TABLE_NAME = ucc.TABLE_NAME
           and ucc.table_name = c1.TABLE_NAME
           and ucc.column_name = c1.COLUMN_NAME
           and uc.CONSTRAINT_TYPE = 'P'
           and uc2.table_name = c2.TABLE_NAME
           and ucc2.column_name = c2.COLUMN_NAME
           and uc2.table_name = ucc2.table_name
           and uc2.r_constraint_name = uc.constraint_name
           and uc2.constraint_type = 'R')

这个(一个草图,虽然没有优化)扫描所有列名称类型相等对,并查找一个是否是 PK,而另一个不引用它。

但是,在这里我同意 Jeffrey 的观点,这是一种非常人性化的事情,没有工具可以肯定地做到这一点。在任何情况下,您都必须手动完成。

于 2010-09-29T05:22:18.003 回答