在旧版数据库基础结构中,如何最好地查找访问某个表或列的视图?我目前正在重构某些表(即删除未使用的列),我想查找仍依赖于这些列的所有视图,如果删除列,将会中断。
是否有任何工具/功能可以搜索Oracle SQL Developer中的所有视图定义?
答案 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'