ヘッダーをスキップ
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス
10g リリース2(10.2)
B19245-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

43 DBMS_FLASHBACK

DBMS_FLASHBACKを使用して、指定した実時間または指定したシステム変更番号(SCN)にデータベースのバージョンをフラッシュバックできます。


関連項目:

DBMS_FLASHBACKの詳細は、次のマニュアルを参照してください。
  • 『Oracle Databaseアプリケーション開発者ガイド-基礎編』

  • 『Oracle Database SQLリファレンス』


この章では、次の項目について説明します。


DBMS_FLASHBACKの使用方法


概要

DBMS_FLASHBACKが有効化された場合、ユーザー・セッションはデータベースのフラッシュバック・バージョンを使用します。また、アプリケーションをデータベースのフラッシュバック・バージョンで実行することができます。

DBMS_FLASHBACKは、次のような場合に使用できます。


セキュリティ・モデル

このパッケージを使用するには、データベース管理者がDBMS_FLASHBACKに対するEXECUTE権限を付与する必要があります。


例外

表43-1 DBMS_FLASHBACKエラー・メッセージ

エラー 説明

ORA-08180

指定された時間が古すぎます。

ORA-08181

無効なシステム変更番号が指定されました。

ORA-08182

ユーザーは、フラッシュバック・モードにおいて、読取り専用またはシリアル化可能トランザクションを開始できません。

ORA-08183

ユーザーは、コミットされていないトランザクションにおいてフラッシュバックを有効化できません。

ORA-08184

ユーザーは、別のフラッシュバック・セッションにおいてフラッシュバックを有効化できません。

ORA-08185

SYSはフラッシュバック・モードを有効化できません。



使用上の注意

接続切断または別の接続の開始によりセッションが終了すると、DBMS_FLASHBACKは自動的に無効化されます。

フラッシュバック・モードでオープンされたPL/SQLカーソルは、フラッシュバック時間またはSCNの時点での行を戻します。 データベースにおける異なる同時セッション(接続)では、異なる実時間またはSCNに対してフラッシュバックを実行できます。 セッションがフラッシュバック・モードで実行されている間は、DMLおよびDDL処理ならびに分散処理を行うことはできません。 オープンしているPL/SQLカーソルは、フラッシュバックを無効にしてDMLを実行するまで使用できます。

自動UNDO管理(AUM)モードでは、保存制御を使用して、必要なデータベースのバージョンを何時間戻すのかを制御できます。24時間フラッシュバックを実行する必要がある場合、DBAはundo_retentionパラメータを24時間に設定する必要があります。 このように、システムはデータの旧バージョンを再生成するのに十分なロールバック情報を保持しています。

UNDO表領域にRETENTION GUARANTEE句を設定し、期限切れになっていないUNDOが廃棄されないようにできます。UNDO_RETENTION自体に完全な保証はありません。システムの領域が不足気味である場合に、期限切れになっていないUNDOが新しく生成されたUNDOによって上書きされることがあるためです。 このような状況は、RETENTION GUARANTEEによって防ぐことができます。 詳細は、『Oracle Database管理者ガイド』を参照してください。

フラッシュバックが有効化されたセッションでは、SYSDATEは影響を受けません。引き続き、現在の時間が提供されます。

ログイン・トリガーにおいてDBMS_FLASHBACKを使用し、アプリケーション・コードを変更せずにフラッシュバックを有効化できます。


高年齢従業員を削除したことにより、その従業員に提出された人員レポートがすべて削除された場合に、フラッシュバックを使用する方法を次に示します。 フラッシュバック機能を使用すると、消失した従業員をリカバリし、再挿入できます。

DROP TABLE employee;
DROP TABLE keep_scn;

REM -- Keep_scn is a temporary table to store scns that we are interested in

CREATE TABLE keep_scn (scn number);
SET ECHO ON
CREATE TABLE employee (
   employee_no   number(5) PRIMARY KEY,
   employee_name varchar2(20),
   employee_mgr  number(5)
      CONSTRAINT mgr_fkey REFERENCES EMPLOYEE ON DELETE CASCADE,
   salary        number,
   hiredate      date
);

REM -- Populate the company with employees
INSERT INTO employee VALUES (1, 'John Doe', null, 1000000, '5-jul-81');
INSERT INTO employee VALUES (10, 'Joe Johnson', 1, 500000, '12-aug-84');
INSERT INTO employee VALUES (20, 'Susie Tiger', 10, 250000, '13-dec-90');
INSERT INTO employee VALUES (100, 'Scott Tiger', 20, 200000, '3-feb-86');
INSERT INTO employee VALUES (200, 'Charles Smith', 100, 150000, '22-mar-88');
INSERT INTO employee VALUES (210, 'Jane Johnson', 100, 100000, '11-apr-87');
INSERT INTO employee VALUES (220, 'Nancy Doe', 100, 100000, '18-sep-93');
INSERT INTO employee VALUES (300, 'Gary Smith', 210, 75000, '4-nov-96');
INSERT INTO employee VALUES (310, 'Bob Smith', 210, 65000, '3-may-95');
COMMIT;

REM -- Show the entire org
SELECT lpad(' ', 2*(level-1)) || employee_name Name
FROM employee
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no = 1
ORDER BY LEVEL;

REM -- Sleep for a short time (approximately 10 to 20  seconds) to avoid
REM -- querying close to table creation

EXECUTE DBMS_LOCK.SLEEP(10);

REM -- Store this snapshot for later access through Flashback
DECLARE
I NUMBER;
BEGIN
I := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
INSERT INTO keep_scn VALUES (I);
COMMIT;
END;
/

REM -- Scott decides to retire but the transaction is done incorrectly
DELETE FROM EMPLOYEE WHERE employee_name = 'Scott Tiger';
COMMIT;

REM -- notice that all of scott's employees are gone
SELECT lpad(' ', 2*(level-1)) || employee_name Name
FROM EMPLOYEE
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no = 1
ORDER BY LEVEL;

REM -- Flashback to see Scott's organization
DECLARE
   restore_scn number;
BEGIN
   SELECT  scn INTO restore_scn FROM keep_scn;
   DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER (restore_scn);
END;
/

REM -- Show Scott's org.
SELECT lpad(' ', 2*(level-1)) || employee_name Name
FROM employee
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no =
   (SELECT employee_no FROM employee WHERE employee_name = 'Scott Tiger')
ORDER BY LEVEL;

REM -- Restore scott's organization.
DECLARE
   scotts_emp NUMBER;
   scotts_mgr NUMBER;
   CURSOR c1 IS
      SELECT employee_no, employee_name, employee_mgr, salary, hiredate
      FROM employee
      CONNECT BY PRIOR employee_no = employee_mgr
      START WITH employee_no =
         (SELECT employee_no FROM employee WHERE employee_name = 'Scott Tiger');
   c1_rec c1 % ROWTYPE;
BEGIN
   SELECT employee_no, employee_mgr INTO scotts_emp, scotts_mgr FROM employee
   WHERE employee_name = 'Scott Tiger';
   /* Open c1 in flashback mode */
   OPEN c1;
   /* Disable Flashback */
   DBMS_FLASHBACK.DISABLE;
 LOOP
   FETCH c1 INTO c1_rec;
   EXIT WHEN c1%NOTFOUND;
   /*
     Note that all the DML operations inside the loop are performed
     with Flashback disabled
   */
   IF (c1_rec.employee_mgr = scotts_emp) then
      INSERT INTO employee VALUES (c1_rec.employee_no,
         c1_rec.employee_name,
         scotts_mgr,
         c1_rec.salary,
         c1_rec.hiredate);
   ELSE
   IF (c1_rec.employee_no != scotts_emp) THEN
   INSERT INTO employee VALUES (c1_rec.employee_no,
         c1_rec.employee_name,
         c1_rec.employee_mgr,
         c1_rec.salary,
         c1_rec.hiredate);
      END IF;
    END IF;
 END LOOP;
END;
/

REM -- Show the restored organization.
select lpad(' ', 2*(level-1)) || employee_name Name
FROM employee
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no = 1
ORDER BY LEVEL;

DBMS_FLASHBACKサブプログラムの要約

表43-2 DBMS_FLASHBACKパッケージのサブプログラム

サブプログラム 説明

DISABLEプロシージャ


セッション全体においてフラッシュバック・モードを無効化します。

ENABLE_AT_SYSTEM_CHANGE_NUMBERプロシージャ


セッション全体においてフラッシュバックを使用できるようにします。 SCNをOracleの数値型として使用し、セッションのスナップショットを指定した数値に設定します。 フラッシュバック・モードでは、すべての問合せにおいて、指定した実時間またはSCNの時点と一致したデータが戻されます。

ENABLE_AT_TIMEプロシージャ


セッション全体においてフラッシュバックを使用できるようにします。 スナップショット・タイムは、query_timeで指定された時間に最も近いSCNに設定されます。

GET_SYSTEM_CHANGE_NUMBERファンクション


現在のSCNをOracleの数値型として戻します。 SCNを使用して、特定のスナップショットを格納できます。

SCN_TO_TIMESTAMPファンクション


現在のSCNをOracleの数値データ型として使用し、TIMESTAMPを戻します。

TIMESTAMP_TO_SCNファンクション


TIMESTAMPを入力に使用し、現在のSCNをOracleの数値データ型として戻します。



DISABLEプロシージャ

このプロシージャは、セッション全体においてフラッシュバック・モードを無効化します。

構文

DBMS_FLASHBACK.DISABLE;

次の例では、従業員Joeの2000年8月30日時点での給与を問い合せています。

EXECUTE dbms_flashback.enable_at_time('30-AUG-2000');
SELECT salary FROM emp where name = 'Joe'
EXECUTE dbms_flashback.disable;

ENABLE_AT_SYSTEM_CHANGE_NUMBERプロシージャ

このプロシージャは、SCNを入力パラメータとして使用し、セッションのスナップショットを指定した数値に設定します。 フラッシュバック・モードでは、すべての問合せにおいて、指定した実時間またはSCNの時点と一致したデータが戻されます。 セッション全体においてフラッシュバックを使用できるようにします。

構文

DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER (
   query_scn IN NUMBER);

パラメータ

表43-3 ENABLE_AT_SYSTEM_CHANGE_NUMBERプロシージャのパラメータ

パラメータ 説明

query_scn

システム変更番号(SCN)。トランザクションのコミットごとに増分するデータベースのバージョン・ナンバーです。



ENABLE_AT_TIMEプロシージャ

このプロシージャは、セッション全体においてフラッシュバックを使用できるようにします。 スナップショット・タイムは、query_timeで指定された時間に最も近いSCNに設定されます。セッション全体においてフラッシュバックを使用できるようにします。

構文

DBMS_FLASHBACK.ENABLE_AT_TIME (
   query_time   IN TIMESTAMP);

パラメータ

表43-4 ENABLE_AT_TIMEプロシージャのパラメータ

パラメータ 説明

query_time

これは、TIMESTAMP型の入力パラメータです。 タイム・スタンプは次の方法で指定できます。

  • TIMESTAMPコンストラクタの使用。

    EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TIMESTAMP '2001-01-09 12:31:00').
    

    グローバリゼーション・サポート(NLS)フォーマットを使用し、文字列を指定します。 フォーマットは、グローバリゼーション・サポートの設定により異なります。

  • TO_TIMESTAMPファンクションの使用。

    EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('12-02-2001 14:35:00', 'DD-MM-YYYY HH24:MI:SS'))
    

    使用する書式を指定します。 この例では、2001年2月12日午後2時35分のTO_TIMESTAMPファンクションを示しています。

  • 問合せ時間から時間が省略された場合、デフォルトはその日の午前12時となります。

  • 問合せ時間にタイム・ゾーンが含まれる場合、タイム・ゾーンの情報は切り捨てられるので注意してください。



GET_SYSTEM_CHANGE_NUMBERファンクション

このファンクションは、現在のSCNをOracleの数値データ型として戻します。 現行の変更番号を取得し、後で使用するために保存できます。 これは特定のスナップショットの保存に便利です。

構文

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
 RETURN NUMBER;

SCN_TO_TIMESTAMPファンクション

このファンクションはSCNをOracleの数値データ型として使用し、対応するTIMESTAMPを戻します。

構文

DBMS_FLASHBACK.SCN_TO_TIMESTAMP
  query_scn  IN        NUMBER)
RETURN TIMESTAMP;

パラメータ

表43-5 SCN_TO_TIMESTAMPプロシージャのパラメータ

パラメータ 説明

query_scn

システム変更番号(SCN)。トランザクションのコミットごとに増分するデータベースのバージョン・ナンバーです。



TIMESTAMP_TO_SCNファンクション

このファンクションはTIMESTAMPを入力に使用し、対応するSCNをOracleの数値データ型として戻します。

構文

DBMS_FLASHBACK.TIMESTAMP_TO_SCN
  query_time    IN        TIMESTAMP
RETURN NUMBER);

パラメータ

表43-6 TIMESTAMP_TO_SCNプロシージャのパラメータ

パラメータ 説明

query_time

これは、TIMESTAMP型の入力パラメータです。 タイム・スタンプは次の方法で指定できます。

  • TIMESTAMPコンストラクタの使用。

     EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TIMESTAMP '2001-01-09 12:31:00')
    

    グローバリゼーション・サポート(NLS)フォーマットを使用し、文字列を指定します。 フォーマットは、グローバリゼーション・サポートの設定により異なります。

  • TO_TIMESTAMPファンクションの使用。

    EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('12-02-2001 14:35:00', 'DD-MM-YYYY HH24:MI:SS'))
    

    使用する書式を指定します。 この例では、2001年2月12日午後2時35分のTO_TIMESTAMPファンクションを示しています。

  • 問合せ時間から時間が省略された場合、デフォルトはその日の午前12時となります。

  • 問合せ時間にタイム・ゾーンが含まれる場合、タイム・ゾーンの情報は切り捨てられるので注意してください。