Как найти таблицы, затронутые в пакете PL SQL? - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно выяснить список таблиц, в которые происходит вставка или обновление в моем существующем пакете PL SQL.Я начал анализировать пакет.Проблема заключается в том, что код пакета состоит из тысяч строк кода и, в свою очередь, вызывает много других пакетов.Также код был написан не мной.Я не могу запустить отчет AWR, поскольку это среда разработки.

Есть ли способ получить таблицы, в которые происходит вставка / обновление после инициации транзакции?Может ли быть написан триггер в соответствии с моим требованием?

Ответы [ 3 ]

5 голосов
/ 02 апреля 2019
-- plain
select *
from dba_dependencies
where name = 'PACKAGE_NAME' and owner = 'PACKAGE_OWNER'
and type in ('PACKAGE', 'PACKAGE BODY') and referenced_type = 'TABLE';

-- hierarchy
select distinct referenced_owner, referenced_name, referenced_type, referenced_link_name
from dba_dependencies
where referenced_type = 'TABLE'
start with name = 'PACKAGE_NAME' and owner = 'PACKAGE_OWNER' 
and type in ('PACKAGE', 'PACKAGE BODY')
connect by nocycle prior referenced_name = name and prior referenced_owner = owner
and replace(prior referenced_type, 'PACKAGE BODY', 'PACKAGE') = replace(type, 'PACKAGE BODY', 'PACKAGE')
and referenced_owner not in ('SYS', 'SYSTEM', 'OUTLN' , 'AUDSYS')
order by 1, 2, 3;
2 голосов
/ 02 апреля 2019

@ 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, но вместо добавления политик удалите их.

0 голосов
/ 02 апреля 2019

Не уверен, что Trigger может быть решением, ниже может быть одним из решений, с некоторыми ручными усилиями, хотя:

  1. Сделайте grep на основной пакет, чтобы найти другие имена пакетов,запишите имена всех пакетов, включая основной.
  2. Получите исходный код всех этих пакетов из таблицы «all_source», с предложением where в атрибуте «NAME» и указав имена пакетов, указанные выше.
  3. Поместите исходный текст для вышеуказанных пакетов в текстовый файл и выполните команду grep для вставки и обновления.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...