Oracle PL/SQL - Den Source Code eines überschriebenen Packages mit Flashback wieder herstellen

Problem:

Falsche Version eines Packages aus dem Git Repository eingespielt und damit die Änderung des Kollegen überschrieben. Dieser hatte den Code aus der DB noch nicht in das Repository übertragen.

Lösung:

Oracle speichert den Source Code der PL/SQL Objekte in der Tabelle sys.source$ mit der Object ID als Schlüssel.

Mit einer Flashback Query ( as of timestamp ) kann mit etwas Glück der alten Datenbestand jeder Tabelle aus den Rollback Segmenten gelesen werden.

Im ersten Schritt die Object ID des betroffenen Packages ermitteln:

sqlplus / AS sysdba
 
SELECT object_id , object_type, object_name,owner
  FROM dba_objects
  WHERE object_name='&CHANGED_PLSQL_OBJ'
/

Mit der ermittelten ID kann nun über die sys.source$ die alte Version des Packages ausgelesen und in eine Datei gespoolt werden

 
SET pagesize 0 linesize 240 newpage 0 SPACE 0
 
 
SET echo off
SET verify off 
SET feedback off
SET heading off
 
 
 
spool export_code.sql
 
 
SELECT SOURCE 
   FROM sys.source$ 
    AS OF TIMESTAMP to_timestamp('03.07.2019 12:00:00','DD.MM.YYYY hh24:MI:SS') 
WHERE obj#=&MY_OBJ_ID ;
 
 
spool off
 
SET feedback ON
SET heading ON
SET echo ON
SET verify ON

Mehr zu Flashback Database siehe Flashback aktivieren und verwenden


Quellen

Oracle: Using Oracle Flashback Query (SELECT AS OF)

Web: