智能Oracle工具,用于查找缺少的字段关系

时间:2010-09-28 18:07:51

标签: oracle relationships

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

3 个答案:

答案 0 :(得分:2)

我现在必须这样做几次。我发现它是一种非常人性化的东西 - 通过在数据字典中运行大量查询(例如EvilTeach的查询),查询列中的样本数据,检查应用程序如何创建数据,以及理解业务需求和用户流程。

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

如果一个工具可以自动执行任何操作并产生有用的结果,我会感到惊讶。

答案 1 :(得分:1)

这可能是一个好的开始

select column_name, table_name, data_type
from user_tab_cols
order by column_name, table_name

答案 2 :(得分: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,另一个不引用它。

但是,在这里我同意杰弗里的说法,这是一种非常人性化的东西,没有任何工具可以做到这一点。无论如何,你必须手工完成。