Апр 202016
 

Разработчики зачастую народ беспокойный и суетливый. Иногда бывает, что они портят или удаляют пакет, замечают это не сразу, и потом просят меня восстановить его. В случае со строками в таблице помогает Flashback, но что делать с пакетами? Вариантов два. TSPITR - частично восстановить где-то на другом хосте базу (табличные пространства SYSTEM, SYSAUX, UNDO) и взять пакеты на полученной новой базе. Способ этот настолько трудоёмкий, что даже говорить не хочется. Второй вариант - таки использовать Flashback, но по-хитрому.

Как известно, в Oracle все метаданные хранятся в словаре данных, который представляет из себя нагромождение таблиц и представлений. Исходный же код хранится в таблице sys.source$, к которой в свою очередь применим запрос вида AS OF TIMESTAMP.
Сперва определим object_id объекта, который нам предстоит спасти:

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

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

CREATE TABLE scott.source_pkg
AS
   SELECT *
     FROM sys.source$
          AS OF TIMESTAMP 
			TO_DATE ('20.04.2016 17:00', 'dd.mm.yyyy hh24:mi')
    WHERE obj# IN (4383720, 4385485);

Всё. Отдаём пользователю полученную таблицу source_pkg и пусть он сам из неё вытаскивает свои исходники.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)