Как узнать, используется ли db-link где-нибудь в DB

#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.

Я думаю, что вероятность пропустить что-то из-за этого последнего бита невелика в системах, с которыми я работаю. Но, если у вас плохо написанные приложения (т. Е. Нет переменных привязки) и ограниченное пространство общего пула, об этом стоит беспокоиться.