web-dev-qa-db-ja.com

新しいコードに置き換えた後、パッケージ本体から古いOracle pl / sqlソースコードを回復できますか?

ヘッダーと多くのコードを含む本文を含むOraclePL/SQLパッケージを作成しました。

後で、別のソースコード(実際には別のパッケージ名で保存するつもりでした)でCREATE OR REPLACE PACKAGE BODY...ステートメントを再実行した後、誤ってその本体からコードを消去してしまいました。

置き換えられた古いソースコードをパッケージから復元する方法はありますか?

12
VVP

All_sourceでフラッシュバッククエリを使用すると、元に戻すことができる場合があります。

例えば私のパッケージ本体は現在バージョン2であり、このクエリを標準ユーザーとして実行しています。

SQL> select text
  2  from all_source
  3  where name = 'CARPENTERI_TEST'
  4  and type = 'PACKAGE BODY';

TEXT


package body carpenteri_test
is

procedure do_stuff
is
begin
   dbms_output.put_line('version 2');
end do_stuff;

end carpenteri_test;

10 rows selected.

今夜9時30分頃にこれを変更したので、SYSDBAユーザーとして接続した後、次のクエリを実行しました。

SQL> select text
  2  from all_source
  3  as of timestamp
  4  to_timestamp('04-JUN-2010 21:30:00', 'DD-MON-YYYY HH24:MI:SS')
  5  where name = 'CARPENTERI_TEST'
  6  and type = 'PACKAGE BODY';

TEXT
----------------------------------------------------------------------------

package body carpenteri_test
is

procedure do_stuff
is
begin
   dbms_output.put_line('version 1');
end do_stuff;

end carpenteri_test;

10 rows selected.

フラッシュバックの詳細については、 ここ を参照してください。 Tom Kyteは、all_source here でフラッシュバックを使用する方法も示しています。

18
Ian Carpenter

DDLコマンドのロギング/監査を有効にしている場合、またはデータベースのバックアップを行っている場合を除いて、答えはほぼ確実ではありません

ストアドプロシージャを含むデータベース定義は、常にソースコードのように扱い、コードリポジトリに保持する必要があります

4
Mark Baker