Oracle
March 20

Oracle. Поиск объектов в БД.

Периодически при ELT приходится изменять алгоритмы сбора таблиц в базе. Хорошо, если эта таблица сама по себе, и больше нигде не используется, или эти изменения не могут никак повлиять на существующие пайплайны или другие объекты. Но не всегда это так, увы, и приходится смотреть зависимости.

Для поиска упоминания нужной таблицы (в примере ниже my_table_name) в хранимом коде подойдёт этот селект:

select * from ALL_SOURCE where upper(text) like '%MY_TABLE_NAME%'

Для поиска представлений, зависящих от искомой таблицы, можно использовать селект ниже:

select so.owner, so.object_name, so.object_type
, 'referenced by' as ref_by, ro.owner, ro.object_name, ro.object_type
from all_objects so -- source object
  join public_dependency pd
    on pd.referenced_object_id=so.object_id
  join all_objects ro -- referenced object
    on ro.object_id=pd.object_id
where so.object_type='TABLE' 
and so.object_name='MY_TABLE_NAME' 
and so.owner='MY_OWNER_NAME'
and ro.object_type = 'VIEW'

Напоследок замечание про представления словаря данных.

The ALL_* data dictionary views show you only objects you have access to and when queried in a procedure show only objects the owner of the procedure has DIRECT access to (as opposed to via a role).

Stored procedures always run with the priveleges granted directly to the owner of the procedure. The ALL_* data dictionary views obey that same logic — they only return the data you can see in the environment you are executing in.

https://www.orafaq.com/usenet/comp.databases.oracle.server/1998/01/22/1124.htm