2010-09-28 13 views
1

Oracle是否有一個工具可用於分析數據庫並幫助確定可能的缺失字段關係?我們有一個包含150多個表的遺留數據庫,缺少許多關係。我們可以手工完成,但是自動化工具可能會有用。所以找到缺少外鍵等等的東西。智能Oracle工具來查找缺失的字段關係

+0

我不知道任何,但我從來沒有這樣做。我首先看到ERD,血壓的升高與圖中可見的缺乏外鍵關係間接成正比。你希望列名是相同的,但它不可靠。祝你好運,知道哪個代理/人工鍵值與哪個父表相關...並且不考慮「設計者」是否將值組合成單個列... – 2010-09-28 18:21:23

回答

2

我有現在這樣做了幾次。通過在數據字典(例如EvilTeach的查詢)中運行大量查詢,從列中查詢示例數據,檢查應用程序如何創建數據以及瞭解應用程序中的數據,我發現它是一種非常人性化的事物業務需求和用戶流程。例如,在許多遺留應用程序中,我發現在前端應用程序中檢查並實施的約束(包括參照完整性約束),這意味着數據遵循約束(幾乎100%:)),但實際上並不是在數據庫級別受到限制。很多有趣的結果。

如果一個工具可以自動執行任何操作併產生有用的結果,我會很驚訝。

1

這可能是一個良好的開端

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

如果您認爲您可以通過在不同表中找到具有相同名稱和數據類型的列來識別POSSIBLE外鍵關係shinp,則可以找到POSSIBLE外鍵缺失,其中一個表是主鍵,另一個表中沒有參考該密鑰。

你可以使用這樣的查詢:

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 ,另一個沒有引用它。

但是,在這裏我同意傑弗裏,這是一種非常人性化的東西,沒有工具可以肯定地做到這一點。無論如何,你必須親自去做。