2015-05-08 3 views
1

В инфраструктуре устаревшей базы данных, как мне лучше всего найти представления, которые обращаются к определенной таблице или столбцу? Я в настоящее время рефакторинг некоторых таблиц (т. Е. Удаление неиспользуемых столбцов), и я хочу найти все представления, которые все еще полагаются на эти столбцы и сломаются, если я удалю столбцы.Найти все представления, содержащие определенную таблицу или столбец

Есть ли какой-либо инструмент/функция для поиска по всем определениям определения в Oracle SQL Developer?

+0

alter table drop column ограничивать? – jarlh

ответ

0

как мне лучше всего найти представление, доступ к определенной таблице

Вы можете отправить запрос об [USER | ALL | DBA] _DEPENDENCIES вида.

SELECT name , 
    type , 
    referenced_name , 
    referenced_type 
FROM user_dependencies 
WHERE TYPE = 'VIEW' 
AND NAME = '<VIEW_NAME>' 
AND referenced_type = '<TABLE_NAME'>; 

Чтобы получить результат для всех взглядов на один раз, снимите фильтр NAME = '<VIEW_NAME>'.

Например,

SQL> column name format a15 
SQL> column type format a15 
SQL> column referenced_name format a15 
SQL> column referenced_type format a15 
SQL> SELECT name , 
    2 type , 
    3 referenced_name , 
    4 referenced_type 
    5 FROM user_dependencies 
    6 WHERE TYPE = 'VIEW'; 

NAME   TYPE   REFERENCED_NAME REFERENCED_TYPE 
--------------- --------------- --------------- --------------- 
EMP_CUSTOM_VIEW VIEW   EMP    TABLE 
EMP_VIEW  VIEW   EMP    TABLE 

SQL> 
0

Потому что искать для всех представлений, которые обращаются к определенной таблице, это может помочь:

select 
    name, 
    type, 
    referenced_name, 
    referenced_type 
from user_dependencies 
where type = 'VIEW' 
    and referenced_type = 'TABLE' 
2

Вы можете использовать что-то вроде функции dependent_views, код ниже. Пример использования:

select dependent_views('CUSTOMER_NAME', 'CUSTOMERS') list from dual 

Output: 
LIST 
----------------- 
SCOTT.V_PERSONS 

Функция ищет dependendent виды в ALL_DEPENDENCIES, следующие поиски TEXT столбцов из ALL_VIEWS для совпадения column_name.

Примечание: поскольку all_dependences может не содержать полные данные зависимых объектов (например, когда представление было создано путем немедленного выполнения), моя функция может не найти этот объект. Также, если column_name является подстрокой другого столбца - функция может возвращаться ко многим представлениям.

create or replace function dependent_views 
    (i_column varchar2, i_table varchar2, i_owner varchar2 default USER) 
    return varchar2 is 

    o_ret varchar2(4000) := ''; 
    v_text long := ''; 
begin 
    for o in (
    select * from all_dependencies 
     where referenced_name = upper(i_table) 
     and referenced_owner = upper(i_owner) 
     and type = 'VIEW') 
    loop 
    begin 
     select text into v_text from all_views 
     where view_name = o.name and owner = o.owner; 
    exception when no_data_found then 
     null; 
    end; 
    if upper(v_text) like '%'||upper(i_column)||'%' then 
     o_ret := o_ret||o.owner||'.'||o.name||' '; 
    end if; 
    end loop; 
    return o_ret; 
end dependent_views; 
Смежные вопросы