如何知道数据库中的某个位置是否使用了数据库链接

问题描述 投票:0回答:3

我想知道是否存在Oracle命令来了解DB-LINK(名称:myBDLink)是否在数据库中的某个位置使用以及如何显示对象(视图,物化视图,过程,函数,...)哪个使用它。

你能帮我吗?

感谢您的帮助

oracle view dblink
3个回答
2
投票

嗯,您可以尝试查询各种系统视图,看看其中是否包含您要查找的字符串。当您想要检查整个数据库时,您可能会以特权用户身份连接并检查

dba_
视图;否则,
all_
user_
就可以了。

例如,检查程序、函数、包……:

select owner, name, type, line
from dba_source
where owner not in ('SYS', 'SYSTEM')
  and lower(text) like '%mydblink%';

PUBLIC.ALL_SOURCE 或 DBA_SOURCE 通常涵盖所有对象类型及其内容,即 PACKAGE BODY、TRIGGER、PACKAGE、PROCEDURE、FUNCTION 和 TYPE。但不幸的是,它没有涵盖 SYNONYMS,而这正是 DB_LINKS 广泛使用的地方。 因此要检查同义词,

从 all_synonyms 中选择 *,其中 DB_LINK = 'MYDBLINKNAME';

要检查视图,您需要一个函数来搜索其

LONG
数据类型列(因为您不能直接在 SQL 中使用它):

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
,因为它们应该包含任何用户的东西。也许您想排除更多用户。


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

select table_name, comments
from dictionary;

TABLE_NAME                     COMMENTS
------------------------------ --------------------------------------------------
USER_CONS_COLUMNS              Information about accessible columns in constraint
                                definitions

ALL_CONS_COLUMNS               Information about accessible columns in constraint
                                definitions

DBA_CONS_COLUMNS               Information about accessible columns in constraint
                                definitions
<snip>

1
投票

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

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

select *
from dba_dependencies
where referenced_link_name is not null
;

1
投票

为了添加 @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 快照之前从库缓存中老化。

我认为在我使用的系统上,由于最后一点而丢失某些内容的可能性很小。但是,如果您的应用程序编写得不好(即没有绑定变量)并且共享池空间有限,那么就需要担心了。

© www.soinside.com 2019 - 2024. All rights reserved.