Ретроспективные запросы и корзина ORACLE

добавлено: 17 май 18
понравилось:0
просмотров: 671
комментов: 0

теги:

Автор: Myp3_u_K

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

А что если нам необходимо узнать , какие данные были в раньше до выполнения операций модификации данных....
как это сделать ?,
Для этого в Oracle предусмотрен механизм ретроспективных запросов (Flashback Query);
То есть, мы можем с помощью запросов посмотреть в прошлое.
Пример подобного запроса
для примера нам понадобится таблица
create table obj_t -- table 
as select owner, object_type  from all_objects group by owner, object_type;
;

запомним время создания таблицы 17:01:01

delete obj_t where object_type = 'TABLE';

удалим наименования таблиц
и запомним время 17:10:14

delete obj_t where owner in ('SYS', 'SYSTEM');

удалим наименования таблиц
и запомним время и запомним время 17:11:22

select *
  from obj_t ;

нет таблиц , нет обьектов owner = sys system

select *
  from obj_t as of scn timestamp_to_scn(to_timestamp('19/04/2018 17:10:00','DD/MM/YYYY HH24:MI:SS')) ;

есть таблицы, нет обьектов owner = sys system

select *
  from obj_t as of scn timestamp_to_scn(to_timestamp('19/04/2018 17:11:00','DD/MM/YYYY HH24:MI:SS')) ;

видим обьекты owner = sys system

recycle bin в Oracle поддерживается начиная с версии 10g .
Если корзина включена (по умолчанию), то при удалении таблиц с помощью конструкции DROP , объест не удаляется
, а просто переименовывается, оставаясь в табличном пространстве пользователя.
Посмотреть содержимое корзины можно с помощью запроса
SELECT * FROM recyclebin;

корзина текущей схемы

SELECT * FROM dba_recyclebin;

корзина для всех схем

очистка корзины:
-- чистим свою
PURGE RECYCLEBIN;

-- чистим все
PURGE DBA_RECYCLEBIN;


отключение корзины
ALTER SESSION SET recyclebin=OFF;


И восстановление ТАБЛИЦЫ ИЗ КОРЗИНЫ
FLASHBACK TABLE my_dropped_table TO BEFORE DROP;


пример
create table t as select owner, count(object_name) cnt from all_objects group by owner;
drop table t;

FLASHBACK TABLE t TO BEFORE DROP;

select * from t;


В Oracle основные сведения хранятся в словаре данных,
словарь состоит из таблиц и представлений.
Исходный пакетов и процедур же код хранится в таблице sys.source$, к которой в свою очередь применим РЕТРОСПЕКТИВНЫЙ запрос вида AS OF TIMESTAMP.

SELECT owner,
       object_name,
       object_type,
       object_id
FROM dba_objects
WHERE object_name = 'MY_PKG';

Если это пакет, то нам понадобятся 2 object_id, один для тела, а другой для определения находим обьекты используя идентификаторы , получаем код :

 SELECT *
     FROM sys.source$
          AS OF TIMESTAMP 
			TO_DATE ('20.04.2016 17:00', 'dd.mm.yyyy hh24:mi')
    WHERE obj# IN (123455, 12345);


извлекаем из таблицы исходные тексты пакета MY_pkg.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии