Восприятие объектов, к которым обращается / обновляется DML в Oracle

Я реализую систему зависимостей для изменений в нашей БД, поэтому, например, для этого и этого изменения нам нужен тот и этот объект в таком-то состоянии. С зависимостями DDL это просто, но мне нужно знать, на какие объекты ссылается данное предложение DML. И последнее тоже может быть динамическим.

Итак, вопрос: есть ли способ сказать, на какие таблицы ссылается данный код DML?

В первую очередь меня интересуют предложения, которые не изменяют таблицу сразу в моем наборе данных, но, возможно, должны изменить ее на стороне клиента, потому что я не могу иметь все варианты. Таким образом, косвенный способ понимания (например, выполнение DML с последующей проверкой того, какие таблицы были изменены) не подходит.


person Community    schedule 31.01.2011    source источник


Ответы (2)


если код DML является запросом, вы можете объяснить его, а затем проверить PLAN_TABLE или dbms_xplan.display_cursor, чтобы проверить, на какие объекты ссылается запрос.

SQL> delete from plan_table;

4 rows deleted

SQL> explain plan for select * from scott.emp;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2872589290
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   518 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   518 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected

SQL> SELECT operation, object_owner, object_name FROM plan_table;

OPERATION            OBJECT_OWNER       OBJECT_NAME
-------------------- ------------------ --------------------
SELECT STATEMENT                        
TABLE ACCESS         SCOTT              EMP

Очевидно, для этого потребуется, чтобы запрос был действителен в базе данных (все объекты, на которые есть ссылки, уже существуют и т. Д.). Если анализируемый код представляет собой блок PL / SQL, я не понимаю, как вы могли бы это сделать, если не написали самодельный синтаксический анализатор.

person Vincent Malgrat    schedule 31.01.2011
comment
Это хорошо! Спасибо, Винсент! Я сейчас изучаю уведомления об изменениях (загрузить .oracle.com / docs / cd / B19306_01 / appdev.102 / b14251 /), я думаю, они должны работать с блоками PL / SQL. Настроил, но пока не работает :) - person ; 31.01.2011

Я исследовал дальше и обнаружил:

  1. Уведомления об изменении базы данных не работают (СЮРПРИЗ!) Для предложений, которые ничего не изменяют в текущем состоянии данных.

  2. Но я думаю, что наконец воспользуюсь AUDIT / FGA. На данный момент он, кажется, понимает предложения, которые на самом деле ничего не меняют, хорошо работает как с явным, так и с динамическим DML в блоках PL / SQL и предоставляет object_name - это именно то, что мне нужно.

person Community    schedule 01.02.2011
comment
Да, похоже, этот подход работает: я устанавливаю аудит всего, что движется для текущего пользователя, запускаю sql-код, затем выбираю object_name и ses_actions (в случае) из dba_audit_trail для текущего сеанса, и вуаля - у меня есть все, что был тронут тем sql. Недостатком этого может быть отсутствие разрешений. - person ; 01.02.2011