Нет простого способа проверить словарь данных, чтобы определить, является ли ссылка общедоступной или нет.Ниже приведены два обходных пути, использующие SYS.LINK $ и DBMS_METADATA, но у каждого из них есть проблемы.
SYS.LINK $
Недокументированная таблица SYS.LINK $ содержит эту информацию в растровом изображении, какобъяснено Соломоном Якобсоном в этой теме :
select name from sys.link$ where bitand(flag,1) = 1;
Но эта таблица содержит хэши паролей и доступна для просмотра только SYS.Возможно, вы могли бы дать разрешение на эту таблицу, что может вызвать некоторые проблемы безопасности.Или создайте представление поверх него, а затем предоставьте это представление, хотя обычно вы не должны создавать объекты в схеме SYS.
DBMS_METADATA
Пакет DBMS_METADATA воссоздает ссылку DDL иможет использоваться для проверки ключевого слова SHARED.
select owner, db_link
from dba_db_links
where lower(dbms_metadata.get_ddl('DB_LINK', db_link, owner)) like '%create shared%';
Это решение может быть медленным, особенно если в системе имеется большое количество ссылок на базы данных.И поиск текстовых строк в исходном коде может быть ненадежным.В соответствии с синтаксическими диаграммами в руководстве нет других ключевых слов, которые могут находиться между CREATE
и SHARED
, но это может измениться или могут быть недокументированные функции или поведение.