Интеллектуальный инструмент Oracle для поиска недостающих полевых отношений - PullRequest
1 голос
/ 28 сентября 2010

Есть ли у Oracle инструмент, который я могу использовать для анализа базы данных и определения возможных пропущенных взаимосвязей полей? У нас есть устаревшая база данных с более чем 150 таблицами, и многие связи отсутствуют. Мы могли бы пройти через это вручную, но может пригодиться автоматизированный инструмент. Поэтому найдите такие вещи, как отсутствие внешних ключей и еще много чего.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2010

Я должен был сделать это несколько раз сейчас.Я нахожу, что это очень человеческий разум - помогает, выполняя множество запросов к обоим словарям данных (например, запрос EvilTeach), запрашивая образцы данных из столбцов, исследуя, как данные создаются приложением, и понимаябизнес-требования и пользовательские процессы.

Например, во многих унаследованных приложениях я нахожу ограничения (включая ограничения ссылочной целостности), которые проверяются и внедряются во внешнем приложении, что означает, что данные следуют ограничению (почти 100).% :)) но это на самом деле не ограничено на уровне базы данных.Множество забавных результатов.

Я был бы удивлен, если бы инструмент мог делать все это автоматически и давать полезные результаты.

1 голос
/ 29 сентября 2010

Вы можете найти ВОЗМОЖНОЕ отсутствие внешнего ключа, если предположите, что можете определить ВОЗМОЖНУЮ связь между внешними ключами, найдя столбцы с одинаковыми именами и типами данных в разных таблицах, одна из которых является первичным ключом, а другая не имеет ссылкик этому ключу.

Вы можете использовать запрос, подобный следующему:

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')

Этот (эскиз, но ни в коем случае не оптимизированный) просматривает все пары равенства типа имени столбца и находит, еслиодин - ПК, а другой не ссылается на него.

Но, и здесь я согласен с Джеффри, это очень человеческий разум, и никакой инструмент точно не сделает этого.В любом случае вам придется делать это вручную.

1 голос
/ 28 сентября 2010

Это может быть хорошим началом

select column_name, table_name, data_type
from user_tab_cols
order by column_name, table_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...