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: