Flashback Queries (ретроспективные запросы) – это сравнительно старая возможность СУБД Oracle, позволяющая восстанавливать данных из сегмента отката. Впервые она появилась в версии 9iR1 и в дальнейшем только совершенствовалась.
Начну рассказ с полезного примера. Представим ситуацию, с которой я сталкивался не раз: во время разработки хранимого кода теряется свежая версия пакета, которая еще не попала в систему управления версиями. Попробуем достать исходный код из словаря, используя ретроспективные запросы.
Для примера создадим функцию, которая возвращает имя пользователя в БД:
Меняем функцию, теперь она возвращает имя пользователя в операционной системе:
Чтобы вернуться к первому варианту функции, выполним запрос (необходимы административные привилегии):
Второй вариант отката с помощью пакета DBMS_FLASHBACK:
Для работы ретроспективных запросов необходимо установить параметр инициализации UNDO_MANAGEMENT=AUTO. Кроме того, на возможность отката влияют размер табличного пространства UNDO и параметр UNDO_RETENTION (в секундах).
Начну рассказ с полезного примера. Представим ситуацию, с которой я сталкивался не раз: во время разработки хранимого кода теряется свежая версия пакета, которая еще не попала в систему управления версиями. Попробуем достать исходный код из словаря, используя ретроспективные запросы.
Для примера создадим функцию, которая возвращает имя пользователя в БД:
SQL> create or replace function myfunc return varchar2
2 is
3 begin
4 return user;
5 end myfunc;
6 /
Function created
Меняем функцию, теперь она возвращает имя пользователя в операционной системе:
SQL> create or replace function myfunc return varchar2
2 is
3 begin
4 return sys_context('USERENV','OS_USER');
5 end myfunc;
6 /
Function created
Чтобы вернуться к первому варианту функции, выполним запрос (необходимы административные привилегии):
SQL> select s.text
2 from all_source as of timestamp (systimestamp - interval '10' minute) s
3 where s.type = 'FUNCTION'
4 and s.name = 'MYFUNC'
5 order by s.line;
TEXT
----------------------------------------------------
function myfunc return varchar2
is
begin
return user;
end myfunc;
6 rows selected
Второй вариант отката с помощью пакета DBMS_FLASHBACK:
SQL> select text from all_source where type = 'FUNCTION' and name = 'MYFUNC' order by line;
TEXT
----------------------------------------------------
function myfunc return varchar2
is
begin
return sys_context('USERENV','OS_USER');
end myfunc;
6 rows selected
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1061838
SQL> exec dbms_flashback.enable_at_system_change_number(1060120);
PL/SQL procedure successfully completed
SQL> select text from all_source where type = 'FUNCTION' and name = 'MYFUNC' order by line;
TEXT
----------------------------------------------------
function myfunc return varchar2
is
begin
return user;
end myfunc;
6 rows selected
SQL> exec dbms_flashback.disable;
PL/SQL procedure successfully completed
Для работы ретроспективных запросов необходимо установить параметр инициализации UNDO_MANAGEMENT=AUTO. Кроме того, на возможность отката влияют размер табличного пространства UNDO и параметр UNDO_RETENTION (в секундах).