ヘッダーをスキップ
Oracle® Database PL/SQLパッケージおよびタイプ・リファレンス
11g リリース2(11.2)
B56262-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

70 DBMS_FLASHBACK_ARCHIVE

DBMS_FLASHBACK_ARCHIVEパッケージには、フラッシュバック・データ・アーカイブ(FDA)が有効な表の基礎となるFDAからの関連付けの解除および基礎となるFDAとの再関連付けを行うための単純な2つのプロシージャが含まれています。


関連項目:

『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』

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


DBMS_FLASHBACK_ARCHIVEの使用方法


概要

Total Recallオプションによって使用できるフラッシュバック・データ・アーカイブ機能は、ユーザーのために作成およびメンテナンスする内部履歴表を厳重に保護します。

読取り専用のセマンティクスによって、DBAを含むユーザーは、フラッシュバック・データ・アーカイブ内部履歴表の更新、削除および挿入が禁止されています。この機能では、ユーザーがこれらの表に関するDDL文を発行することも禁止されています。フラッシュバック・データ・アーカイブによって施行されるこの厳密なセキュリティは、法規制の遵守が求められるアプリケーションの要件に適合します。この機能では、フラッシュバック・データ・アーカイブに対して有効にされたユーザー表で、表の定義を変更したりデータの移動を行なうDDL文を含む多数の一般的なDDL文をサポートします。ただし、この機能に対して有効にされた表でサポートされないDDL文もあります。ほとんどのアプリケーション・スキーマは、ソフトウェアの新しいバージョンがリリースされると進化するため、元表でDDL操作を実行できることは主要な顧客要件です。

フラッシュバック・データ・アーカイブでサポートされるDDL文を超えて、アプリケーション・アップグレードやその他の表メンテナンス・タスク中にユーザー・アプリケーションのスキーマの進化をサポートするために、DBMS_FLASHBACK_ARCHIVEパッケージは簡単に使用できるPL/SQLプロシージャのセットを提供しています。

  • フラッシュバック・データ・アーカイブが有効な元表と基礎となるFDAの関連付けを解除する。

  • 一時的に関連付けを解除した元表を基礎となるFDAに再関連付けする。

ユーザーが元表とFDAの関連付けを解除した後は、元表またはFDAの履歴表で任意のDDL文を発行することができます。スキーマの変更が完了したら、ユーザーは元表とFDAの再関連付けを行い、フラッシュバック・データ・アーカイブ保護が機能して、自動追跡とアーカイブを再開します。


セキュリティ・モデル

FLASHBACK ARCHIVE ADMINISTERシステム権限を持つユーザーが、関連付けの解除および再関連付けPL/SQLプロシージャを実行できます。表の関連付けが解除されると、表に対して必要な権限があれば、通常のユーザーもDDLおよびDML文を実行できます。


通常、ユーザーは履歴表を変更することはできません。

SQL> DELETE FROM scott.SYS_FBA_HIST_61527;

ERROR at line 1: 
ORA-55622: DML, ALTER and CREATE UNIQUE INDEX operations are not allowed on table "SCOTT"."SYS_FBA_HIST_61527"

ユーザーは履歴表に関するDDL文を発行することもできません。

SQL> ALTER TABLE scott.SYS_FBA_HIST_61527 DROP COLUMN comm;

ERROR at line 1: 
ORA-55622: DML, ALTER and CREATE UNIQUE INDEX operations are not allowed on table "SCOTT"."SYS_FBA_HIST_61527"

DISASSOCIATE_FBAプロシージャを使用して、scott.emp_test表の関連付けを解除します。

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('scott','emp_test');

PL/SQL procedure successfully completed. 

これでユーザーは(DDL文によって)ユーザーの元表の構造を変更できます。

SQL> ALTER TABLE scott.emp_test RENAME COLUMN sal TO salary;

Table altered.

またユーザーは以前には変更できなかった履歴表の内容も変更できます。

SQL> DELETE FROM scott.SYS_FBA_HIST_61527 WHERE empno=3968;

2 rows deleted. 

ユーザーが履歴表と元表を再関連付けしようとすると、(DDL文によって)対応する履歴表の構造変更を行っていないため失敗します。

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('scott','emp_test');
BEGIN DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('scott','emp_test');
END;

ERROR at line 1:
ORA-55636: Flashback Data Archive enabled table "SCOTT"."EMP_TEST" has different definition from its history table
ORA-06512: at "SYS.DBMS_FLASHBACK_ARCHIVE", line 17
ORA-06512: at line 1

表の関連付けを解除して表定義の問題を修正します。

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('scott','emp_test');

PL/SQL procedure successfully completed.

履歴表で同じ列の名前変更DDLを実行して、定義を元表のscott.emp_testと一致させます。

SQL> ALTER TABLE scott.SYS_FBA_HIST_61527 RENAME COLUMN sal TO salary;

Table altered.

これで、元表は履歴表と正常に再関連付けされます。

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('scott','emp_test')

PL/SQL procedure successfully completed.

前述の例は、説明のために使用されています。RENAME COLUMNはサポートされるDDLとして使用できるので、当然ながら関連付け解除/再関連付けを呼び出す必要はありません。関連付け解除/再関連付けを行う必要があるのは、操作がフラッシュバック・アーカイブによってサポートされておらず、55610エラー・メッセージが生成される場合のみです。

SQL> create table emp_test as select empno, sal from emp;

表が作成されます。

SQL> alter table emp_test flashback archive;

表が変更されます。

ベース表と同じ形式に、追加のメタデータ列を指定して、一時履歴表を作成します。

SQL>  EXEC DBMS_FLASHBACK_ARCHIVE.CREATE_TEMP_HISTORY_TABLE('scott','emp_test');

PL/SQLプロシージャが正常に終了しました。

SQL> describe scott.temp_history
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 RID                                                VARCHAR2(4000)
 STARTSCN                                           NUMBER
 ENDSCN                                             NUMBER
 XID                                                RAW(8)
 OPERATION                                          VARCHAR2(1)
 EMPNO                                              NUMBER(4)
 SAL                                                NUMBER(7,2)

データベースごとに次の操作を 1 回ずつ行います。これにより、以前の履歴のインポートを実行できるように、マッピングが過去まで拡張されます。88年1月1日までさかのぼります。

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.extend_mappings();

PL/SQLプロシージャが正常に終了しました。

SQL> insert into scott.temp_history values (NULL, timestamp_to_scn(to_date('01-JAN-06')), timestamp_to_scn(to_date('31-DEC-06')), NULL, 'U', 1, 1000);

1行が作成されます。

SQL> commit;

コミットが完了します。

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.IMPORT_HISTORY('scott','emp_test');

PL/SQLプロシージャが正常に終了しました。

これで、インポートされたデータのフラッシュバック問合せが可能になります。

SQL> select * from scott.emp_test as of timestamp to_date('06-JUN-06') where empno=1;
 
     EMPNO        SAL                                                          
---------- ----------                                                          
         1       1000 

DBMS_FLASHBACK_ARCHIVEサブプログラムの要約

表70-1 DBMS_FLASHBACK_ARCHIVEパッケージのサブプログラム

サブプログラム 説明

DISASSOCIATE_FBAプロシージャ


指定した表とフラッシュバック・データ・アーカイブの関連付けを解除します。

REASSOCIATE_FBAプロシージャ


指定した表をフラッシュバック・データ・アーカイブと再関連付けします。



DISASSOCIATE_FBAプロシージャ

このプロシージャは、指定した表とフラッシュバック・データ・アーカイブの関連付けを解除します。

構文

DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA (
   owner_name      VARCHAR2, 
   table_name      VARCHAR2);

パラメータ

表70-2 DISASSOCIATE_FBAプロシージャのパラメータ

パラメータ 説明

owner_name

フラッシュバック・データ・アーカイブが有効な元表のスキーマ。

table_name

フラッシュバック・データ・アーカイブが有効な元表の名前。


例外

表70-3 DISASSOCIATE_FBAプロシージャの例外

パラメータ 説明

ORA-55602

ユーザー表がフラッシュバック・データ・アーカイブに対して有効ではありません。

ORA-55634

関連付けを解除するためのロックを表で取得できません。



REASSOCIATE_FBAプロシージャ

このプロシージャは、指定した表とフラッシュバック・データ・アーカイブを再関連付けします。

構文

DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA (
   owner_name      VARCHAR2, 
   table_name      VARCHAR2);

パラメータ

表70-4 REASSOCIATE_FBAプロシージャのパラメータ

パラメータ 説明

owner_name

フラッシュバック・データ・アーカイブが有効な元表のスキーマ。

table_name

フラッシュバック・データ・アーカイブが有効な元表の名前。


例外

表70-5 REASSOCIATE_FBAプロシージャの例外

パラメータ 説明

ORA-55602

ユーザー表がフラッシュバック・データ・アーカイブに対して有効ではありません。

ORA-55636

表定義の検証に失敗しました。


使用上の注意

  • 元表と履歴表の定義が同一でない場合、プロシージャはエラーを通知します。たとえば、列が追加された場合や表が分割された場合は、元表と履歴表のスキーマが同じであることが必要です。

  • FDA内部履歴表のスキーマには行バージョンのメタデータ列があります。ユーザーに削除されたメタデータ列がある場合、プロシージャはエラーを通知します。