@ akk0rd87 имеет лучший ответ - DBA_DEPENDENCIES
, с CONNECT BY
для получения использования таблиц вызываемыми процедурами.
Единственное, что его ответ не найдет, - это таблицы, используемые напрямую из-за динамическогоSQL (например, EXECUTE IMMEDIATE
).Для этого вы можете использовать детальный аудит.
Для меня этот подход - просто резервное копирование после того, как вы будете следовать совету @ akk0rd87.
Поскольку SO не бесплатная служба написания кода, я просто дам вам широкие штрихи.
1) Создайте таблицу, которая будет служить вашим контрольным журналом.Убедитесь, что в нем есть следующие столбцы, как минимум:
- SCHEMA_NAME (30 символов)
- TABLE_NAME (30 символов)
- CALL_STACK (4000 символов)
- SQL_STMT (4000 символов)
2) Создать пакет для использования в качестве обработчика аудита.Я предоставлю вам код для этого, потому что он должен соответствовать точному API, который я даю, чтобы его можно было использовать с мелкозернистым аудитом.
CREATE OR REPLACE PACKAGE BODY xxcust_table_access_aud_pkg AS
PROCEDURE audit_access ( schema_name VARCHAR2, table_Name VARCHAR2, policy_name VARCHAR2 ) IS
BEGIN
INSERT INTO your_audit_table ( SCHEMA_NAME, TABLE_NAME, CALL_STACK, SQL_STMT )
VALUES ( schema_name,
table_Name,
substr(DBMS_UTILITY.format_call_stack,1,4000),
substr(SYS_CONTEXT ('userenv', 'CURRENT_SQL'),1,4000)
)
EXCEPTION
WHEN others THEN
null;
END;
END xxcust_table_access_aud_pkg ;
3) Перебрать все таблицы в вашем приложениисхема и вызов DBMS_FGA.ADD_POLICY
для каждого.Например,
FOR r IN ( ... all my tables ... ) LOOP
DBMS_FGA.add_policy(object_schema=> r.owner,
object_name => r.table_name,
policy_Name => -- make up something unique, maybe table_name plus some number,
audit_condition => '1=1',
audit_column => null,
handler_schema => -- your schema,
handler_module => 'XXCUST_TABLE_ACCESS_AUD_PKG', -- the package above
enable => true);
4) Запустите пакет и проверьте таблицу на предмет результатов
5) Повторите шаг 3, но вместо добавления политик удалите их.