Oracle是否有一个工具可用于分析数据库并帮助确定可能缺少的字段关系?我们有一个包含150多个表的遗留数据库,并且缺少许多关系。我们可以手工完成它,但自动化工具可能很有用。所以找到丢失外键和诸如此类的东西。
答案 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,另一个不引用它。
但是,在这里我同意杰弗里的说法,这是一种非常人性化的东西,没有任何工具可以做到这一点。无论如何,你必须手工完成。