查找包含特定表或列的所有视图

时间:2015-05-08 09:31:15

标签: sql oracle oracle-sqldeveloper legacy

在旧版数据库基础结构中,如何最好地查找访问某个表或列的视图?我目前正在重构某些表(即删除未使用的列),我想查找仍依赖于这些列的所有视图,如果删除列,将会中断。

是否有任何工具/功能可以搜索Oracle SQL Developer中的所有视图定义?

3 个答案:

答案 0 :(得分:2)

您可以使用类似函数dependent_views的代码,代码如下。用法示例:

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

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

功能搜索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;

答案 1 :(得分: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>

答案 2 :(得分:0)

因为您搜索访问某个表的所有视图,这可能会有所帮助:

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