如何知道是否在数据库中某处使用了数据库链接

问题描述

我想知道它是否存在一个Oracle命令,以了解是否在DB的某处使用了DB-LINK(名称:myBDLink)以及如何显示对象(视图,实例化视图,过程,函数等)。 。)使用它。

您能帮我吗?

感谢您的帮助

解决方法

好吧,您可以尝试查询各种系统视图,并查看其中是否包含要查找的字符串。当您要检查整个数据库时,您可能会以特权用户身份连接并检查dataElementName = el_coll(Left(wb.Name,5)) 视图;否则,将使用dba_all_

例如,要检查过程,功能,程序包......

user_

要查看视图,您需要一个函数来搜索其select owner,name,type,line from dba_source where owner not in ('SYS','SYSTEM') and lower(text) like '%mydblink%'; 数据类型列(因为您不能直接在SQL中使用它):

LONG

然后

create or replace function f_long(par_view in varchar2,par_String in varchar2) 
  return varchar2 
is
  l_text varchar2(32000);
begin
  select text 
    into l_text
    from dba_views 
    where owner not in ('SYS','SYSTEM')
      and view_name = par_view;
    
  return case when instr(lower(l_text),lower(par_string)) > 0 then 1
              else 0 
         end;              
end;
/

我排除了select owner,view_name from dba_views where f_long(view_name,'mydblink') = 1; SYS,因为它们应该包含用户的任何内容。也许您想排除更多用户。


要查看更多(重新)资源,请查询字典,例如

SYSTEM
,

没有完整的答案。数据库如何知道数据库外部的代码?不可以因此,如果您拥有sql脚本或某些不依赖存储过程来完成所有操作的应用程序,则数据库将不知道它们。

也就是说,对于数据库中存储过程中 的依赖项,您可以尝试以下操作:

select *
from dba_dependencies
where referenced_link_name is not null
;
,

要添加到@Littlefoot和@EdStevens发布的其他(正确)答案中,还可以针对自动工作量存储库(AWR)进行快速,肮脏的分析。

这种方法的好处是,无论SQL是否在DBA_SOURCE中(例如,嵌入在外部应用程序中),它都会从提交到数据库的SQL中查找远程对象的用法。

-- Find any objects referenced across a database link (sort of)
select object_node,object_name,count(distinct sql_id) sql_id_count
from dba_hist_sql_plan
where object_type = 'REMOTE'
group by object_node,object_name
order by object_node,object_name
;

问题是AWR数据不是100%完整。首先,它不会永远保留下去,因此不会看到数据库链接上一次使用超过一个月(或两个月,或者您的DBA保留AWR数据的时间太长)。其次,AWR仅定期(例如每小时)拍摄快照。因此,从理论上讲,SQL可以使用数据库链接,然后在下一个AWR快照之前从库缓存中删除。

在我使用的系统上,我认为由于最后一点而丢失某些东西的机会很小。但是,如果您的应用程序编写得很差(即没有绑定变量)并且共享池空间有限,则需要担心。