Восприятие объектов, к которым обращается / обновляет DML в Oracle - PullRequest
1 голос
/ 31 января 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 31 января 2011

если код 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, я не понимаю, как вы могли бы сделать это, если бы не самодельный парсер.

1 голос
/ 01 февраля 2011

Я исследовал дальше и нашел:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...