【发布时间】:2020-11-10 15:22:15
【问题描述】:
我想知道是否存在一个 Oracle 命令来了解是否在 DB 中的某处使用了 DB-LINK(名称:myBDLink)以及如何显示对象(视图、物化视图、过程、函数、.. .) 使用它。
你能帮我解决这个问题吗?
感谢您的帮助
【问题讨论】:
-
如果一切都失败了,在远程数据库上的数据库链接用户上设置一个登录后触发器,以审计数据库链接的使用情况。
我想知道是否存在一个 Oracle 命令来了解是否在 DB 中的某处使用了 DB-LINK(名称:myBDLink)以及如何显示对象(视图、物化视图、过程、函数、.. .) 使用它。
你能帮我解决这个问题吗?
感谢您的帮助
【问题讨论】:
好吧,您可以尝试查询各种系统视图并查看其中是否包含您要查找的字符串。当您想检查整个数据库时,您可能会以特权用户身份连接并检查dba_ 视图;否则,all_ 或 user_ 可以。
例如,检查过程、函数、包……:
select owner, name, type, line
from dba_source
where owner not in ('SYS', 'SYSTEM')
and lower(text) like '%mydblink%';
要检查视图,您需要一个函数来搜索其 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>
【讨论】:
没有完整的答案。数据库如何知道数据库之外的代码?它不能。所以如果你有一个 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 快照之前从库缓存中老化。
我认为在我使用的系统上,由于最后一点而丢失某些东西的可能性很小。但是,如果您的应用程序写得不好(即没有绑定变量)并且共享池空间有限,那就需要担心了。
【讨论】: