#oracle #view #dblink
#Oracle #Вид #dblink
Вопрос:
Я хотел бы знать, существует ли команда Oracle, чтобы узнать, используется ли DB-LINK (имя: myBDLink) где-нибудь в БД и как отображать объекты (представления, материализованные представления, процедуры, функции, …), Которые ее используют.
Не могли бы вы, пожалуйста, помочь мне с этим?
Спасибо за вашу помощь
Комментарии:
1. Если все не удается, настройте триггер ПОСЛЕ ВХОДА в систему для пользователя DB Link в удаленной БД, который проверяет использование DB link.
Ответ №1:
Ну, вы могли бы попробовать запросить различные системные представления и посмотреть, содержит ли какое-либо из них строку, которую вы ищете. Поскольку вы хотите проверить всю базу данных, вы, вероятно, подключитесь как привилегированный пользователь и проверите 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>
Комментарии:
1. По-видимому, dba_source, dba_views не распознаются, не могли бы вы помочь мне с этим?
2. Вы должны быть привилегированным пользователем, чтобы их видеть (например, SYS). Если это не так, поговорите со своим администратором базы данных, чтобы узнать, что они могут сделать. Для начала запустите скрипт с ALL_SOURCE и ALL_VIEWS; он покажет данные об объектах, к которым у вас есть доступ.
Ответ №2:
Полного ответа нет. Как база данных узнает о коде, который находится за пределами базы данных? Это невозможно. Итак, если у вас есть sql-скрипт или какое-либо приложение, которое не полагается на хранимые процедуры для выполнения всего, база данных не будет знать о них.
Тем не менее, для зависимостей, которые находятся в хранимых процедурах в базе данных, вы можете попробовать это:
select *
from dba_dependencies
where referenced_link_name is not null
;
Комментарии:
1. Я попробовал запрос (даже ту часть, где), но он не работает. dba_dependencies не распознается. Не могли бы вы помочь мне с этим
Ответ №3:
Чтобы добавить к другим (правильным) ответам, опубликованным @Littlefoot и @EdStevens, быстрый и грязный анализ также может быть выполнен в отношении автоматизированного хранилища рабочей нагрузки (AWR).
Преимущество этого подхода заключается в том, что он найдет использование удаленных объектов из SQL, отправленных в базу данных, независимо от того, включен этот SQL DBA_SOURCE
или нет (например, встроен во внешнее приложение).
-- 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%. Прежде всего, он не хранится вечно, поэтому ссылка на базу данных, которая использовалась в последний раз более месяца (или два месяца, или как долго ваши администраторы баз данных хранят данные AWR), не будет видна. Во-вторых, AWR делает снимки только периодически, скажем, каждый час. Таким образом, теоретически возможно, что SQL использует ссылку на базу данных, а затем удаляется из кэша библиотеки перед следующим снимком AWR.
Я думаю, что вероятность пропустить что-то из-за этого последнего бита невелика в системах, с которыми я работаю. Но, если у вас плохо написанные приложения (т. Е. Нет переменных привязки) и ограниченное пространство общего пула, об этом стоит беспокоиться.