Oracle是否有一个工具,我可以用它来分析数据库,并帮助确定可能缺少野外关系?我们有150多个表和多对多关系缺少旧的数据库。我们可以通过它的手,但自动化工具可能是有用的。所以找东西像失踪外键和诸如此类的东西。

有帮助吗?

解决方案

我有现在这样做了几次。我觉得这是一个非常人性化的智能样的事情 - 通过跑了很多跨两个数据字典的查询(如EvilTeach的查询),从列查询样本数据,研究如何将数据由应用程序创建和理解帮助业务需求和用户进程。

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

我会如果工具能够自动做任何的这一点,并产生有用的结果感到惊讶。

其他提示

这可能是一个好的开始

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

您可以找到一个可能的外键不存在,如果你认为你可以通过在不同的表相同的名称和数据类型,其中一个是主键找到列识别可能的外键relationshinp,而另一个没有参考该密钥。

您可以使用这样的查询:

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,而另一个不引用它。

不过,在这里,我同意杰弗里,这是一个非常人性化的智能之类的话,也没有工具将做到这一点是肯定的。在任何情况下,你必须通过做手工。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top