вторник, 6 июля 2010 г.

Последние изменения в базе

Часто возникает необходимость узнать какие данные в каких таблицах изменялись в последнее время. Сделать это можно с помощью запроса:
 select *
from sys.MON_MODS$ m,
sys.all_objects o
where m.obj# = o.OBJECT_ID
and o.OWNER not in ('SYS','SYSTEM','SYSMAN','DBSNMP','SNMP_USER')
order by m.timestamp

Запрос не отображает изменения в системных таблицах.
Подобную информацию должен отображать и запрос:
select table_owner,table_name,inserts,updates,deletes,truncated,timestamp
from sys.dba_tab_modifications
where table_owner not in ('SYS','SYSTEM','SYSMAN','DBSNMP','SNMP_USER')
order by timestamp
но в него почемуто попадают не все изменения.

3 комментария:

Анонимный комментирует...

http://mwidlake.wordpress.com/2010/07/05/dba_tab_modifications-can-miss-multi-table-inserts/ вот почему не все показывается

Александр Тышенко комментирует...

Думаю существуют еще другие причины кроме многотабличной вставки т.к. многотабличной вставкой я не пользовался.

Sayan Malakshinov комментирует...

Там все хуже - это кривая вьюха. Сейчас трудно вспомнить и лениво коннектиться к ораклу, но вкратце проблема в неправильном коде вьюхи. При определенных предикатах запрос как-то криво трансформируется, что не может ничего вывести. У меня был тесткейс когда select * from dba_tab_modifications where table_name=... находил и выводил данные по искомой таблице, а select * from dba_tab_modifications where table_name=... and owner=... - нет.
Если хотите завтра с утра могу все полностью показать.