ヘッダーをスキップ
Oracle Database Workspace Manager開発者ガイド
11gリリース1(11.1)
E05678-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

1 Workspace Managerの概要

Oracle Workspace Manager(Workspace Managerとも呼ばれる)は、作業領域を作成し、バージョンが異なる表の行の値を、異なる作業領域にグループ化できるインフラストラクチャを提供します。ユーザーは、古いデータのコピーを保持しながら、更新するデータの新しいバージョンを作成することができます。アクティビティの結果が永続的に格納され、同時実行性および一貫性が保証されます。

Workspace Managerは、通常、次の操作を実行するアプリケーションに有効です。

Workspace Managerは、ロング・トランザクションの使用例を管理する場合にも有効です。複雑で継続時間の長いデータベース・トランザクションは、完了するまでに数日かかり、複数のユーザーが同一データベースにアクセスする必要があります。

この章では、Workspace Managerを使用するために理解しておく必要がある概念および操作について説明します。この章の内容は次のとおりです。

Workspace Managerの完全な例については、第1.17項を参照してください。ただし、その例が示す概念を理解するには、まず、この章のこれ以降の説明を読む必要があります。


注意:

デフォルトでは、Workspace Managerは、Oracleシード・データベース、およびDatabase Configuration Assistant(DBCA)を使用して作成された任意のデータベースにインストールされます。その他のOracleデータベースでWorkspace Managerを使用するには、まず、付録A「カスタム・データベースでのWorkspace Managerのインストール」に示すインストール手順を実行してください。

1.1 Workspace Managerの概要

Workspace Managerでは、データベース内の1つ以上のユーザー表をバージョン対応にすることができます。バージョン対応表では、表内のすべての行は複数バージョンのデータをサポートします。バージョニングのインフラストラクチャは、データベース・ユーザーからは見えません。また、データの選択、挿入、変更、削除を行うアプリケーションのSQL文は、通常どおり、バージョン対応表に対する処理を続けます。ただし、バージョン対応表の主キー列の値は更新できません。(Workspace Managerは、システム・ビューを保持し、INSTEAD OFトリガーを作成することによって、これらの機能を実装します。詳細は、第1.1.11項を参照してください。ただし、アプリケーション開発者およびユーザーは、ビューおよびトリガーを調べたり、対話したりする必要はありません。)

表がバージョン対応になると、作業領域内のユーザーに必要なレコードの正確なバージョンが自動的に表示されます。表をバージョン対応にする必要がなくなった場合は、表のバージョニングを使用禁止にできます。

作業領域とは、データベース内のデータに対して変更を加えるために1人以上のユーザーが共有できる仮想環境です。作業領域は、1つ以上のバージョン対応表の新しい行バージョンの集合を論理的にグループ化し、これらのバージョンが本番データと明示的にマージされるか、または廃棄されるまで切り離しておきます。そのため、最大の同時実行性が得られます。ユーザーは、作業領域に対して様々な操作(移動、作成、リフレッシュ、マージ、ロールバック、削除、圧縮、変更など)を実行できます。

ユーザーが作業領域内にいる場合は、トランザクションの一貫性を保持したデータベース全体のビューが常に表示されます。つまり、現行の作業領域で行われた変更の他に、作業領域の作成時、または親作業領域の変更によって作業領域が最後にリフレッシュされた時点でデータベースに存在したそれ以外のデータも表示されます。(作業領域階層、親作業領域および子作業領域については、第1.1.1項を参照してください。)

Workspace Managerは競合を自動的に検出します。競合とは、作業領域および親作業領域内の同一行に対する変更によるデータ値の差異です。作業領域内の変更を親作業領域にマージする前に、競合を解消する必要があります。作業領域ロックを使用すると、競合を回避できます。

セーブポイントは、バージョン対応表の行変更をロールバックできる作業領域内のポイントで、その時点でデータベースに存在していた内容を調べることができます。通常、セーブポイントは、設計段階の完了時や支払い期限の終了時などビジネス関連指標に応じて作成されます。(セーブポイントの詳細は、第1.1.2項を参照してください。)

履歴オプションは、バージョン対応表のすべての行に加えられた変更にタイムスタンプを付け、各行に加えられたすべての変更または最新の変更のみのコピーを保存できます。バージョン対応表で、すべての変更を保存する場合(without overwrite履歴オプションを指定)は、すべての行バージョンに対して行われたすべての変更の永続履歴を保存します。また、ユーザーが希望するポイントに移動して、その作業領域に存在していたデータベースを表示できるようにします。

Workspace Managerは、作業領域、セーブポイント、履歴情報、権限、アクセス・モードおよびWorkspace Managerロックを管理し、競合を検出および解消するために、新規アプリケーションおよび既存アプリケーションに追加できる総合的なPL/SQL APIを提供します。また、これらの操作のほとんどは、Oracle Enterprise ManagerのGraphical User Interface(GUI)を使用して実行することもできます。

Workspace Managerによって作成される別のデータベース・オブジェクトは、行バージョンを作業領域にマップするデータベース全体のシステム表です。この表は、ユーザーからは見えません。

1.1.1 作業領域階層

データベース内には、作業領域の階層が存在する可能性があります。たとえば、1つの作業領域が1つ以上の作業領域(子作業領域)の親である可能性があります。デフォルトでは、作業領域は、最上位、つまりLIVEデータベース作業領域から作成されます。(作業領域名には大/小文字区別があり、LIVEデータベースの作業領域名の綴りはLIVEとなります。作業領域名の長さは30文字以下であり、作業領域階層の深さは30レベル以下である必要があります。)ユーザーは、GotoWorkspace操作によって作業領域内に移動します。

図1-1に、作業領域の階層を示します。この図では、作業領域1および作業領域4LIVEデータベース作業領域から、作業領域2および作業領域3は作業領域1から、作業領域5は作業領域4から形成されています。作業領域1の作成後、作業領域1を指定してGotoWorkspace操作を実行し、次にCreateWorkspace操作を実行して作業領域2および作業領域3を作成しています。その後、作業領域4および作業領域5でも同様の手順を実行しています。

図1-1 作業領域ツリー

図1-1の説明
「図1-1 作業領域ツリー」の説明

特定のニーズのために子作業領域を作成するか、またはセーブポイントを作成するかの決定は、設計段階で行います。詳細は、第1.1.2.1項を参照してください。

1.1.2 セーブポイントの使用

セーブポイントとは、データ変更をロールバックできる作業領域内のポイントです。Workspace Managerは、不要な変更が含まれている行バージョンを削除して、ロールバックを実行します。

明示的セーブポイントとは、作成して名前を付けるセーブポイントです。バージョン対応表内の変更は、後でセーブポイントまでロールバックできます。または、セーブポイントに移動して、そのセーブポイントが作成された時点でのデータベース全体の状態(バージョン対応の行を含む)を表示できます。図1-2に、作業領域内に作成された明示的セーブポイント(SP1SP2SP3およびSP4)を示します。(図1-2では、セーブポイントが破線で示されています。)

図1-2 セーブポイント

図1-2の説明
「図1-2 セーブポイント」の説明

また、新しい作業領域が作成されるたびに、暗黙的セーブポイントが自動的に作成されます。暗黙的セーブポイントは、子作業領域内のユーザーが、作業領域の作成時にアクセス制限されたデータベースのビューを取得するために必要です。したがって、図1-2では、作業領域1および作業領域4の作成に対応してLIVE作業領域内に2つの暗黙的セーブポイント(SPaおよびSPd)が作成され、作業領域2および作業領域3の作成に対応して作業領域1内に2つの暗黙的セーブポイント(SPbおよびSPc)が作成されます。また、作業領域5の作成に対応して作業領域4内に1つの暗黙的セーブポイント(SPe)が作成されます。

Workspace Managerは、LATESTという名前を使用して、作業領域内の最新バージョンを示す論理セーブポイントを指定します。セーブポイントがDBMS_WMサブプログラム(プロシージャまたはファンクション)のオプションのパラメータであるときは、多くの場合、LATESTがデフォルトです。

削除可能なセーブポイントとは、CompressWorkspaceCompressWorkspaceTreeおよびDeleteSavepointプロシージャによって削除可能なセーブポイントです。次の条件のいずれかに該当する場合、セーブポイントは削除可能です。

  • 明示的セーブポイントである。

  • 子作業領域と依存性がない暗黙的セーブポイントである。

1.1.2.1 設計面の問題: セーブポイントまたは子作業領域のいずれを作成するか

Workspace Managerでは、ある時点でプロジェクトを保存するために、セーブポイントを作成するか、子作業領域を作成するかという設計面の問題が発生する可能性があります。セーブポイントと子作業領域のいずれを使用しても、一連の変更のグループ化、異なる行バージョンの変更の比較、および一連の変更のロールバックが可能です。ただし、セーブポイントを作成すると、同一作業領域内で継続して変更を加えることができ、その作業領域内の他のユーザーがすぐに変更にアクセスできるようになります。(別の作業領域内の変更は、現行の作業領域がリフレッシュまたはマージされるまで、ユーザーには表示されません。)また、セーブポイントを作成すると、一連の変更を簡単にアーカイブできるようになります。これらの変更は、後でロールバックできます。

これに対し、子作業領域を作成すると、一連の複雑な変更を加えることができる分離された環境を提供でき、これらの変更を親作業領域(本番データなど)から完全に削除できます。あるシナリオに基づいて独立した環境を設定し、親作業領域内の通常のユーザーがこのシナリオのデータにアクセスする必要がない場合は、親作業領域内にセーブポイントを作成するかわりに、子作業領域を作成してください。

1.1.3 作業領域の変更のマージおよびロールバック

作業領域は、マージまたはロールバックできます。

作業領域のマージでは、子作業領域で行われた変更がその親作業領域に適用されます。その後、子作業領域は削除されます。作業領域をマージするには、MergeWorkspaceプロシージャを使用します。

作業領域のロールバックでは、作業領域内のすべてのデータ変更(行バージョン)、または明示的セーブポイント以降のすべての変更のいずれかが削除されます。

  • 作業領域内のすべての変更をロールバックするには、RollbackWorkspaceプロシージャを使用します。

  • セーブポイント以降の作業領域内の変更をロールバックするには、RollbackToSPプロシージャを使用します。


    注意:

    指定したセーブポイント以降に暗黙的セーブポイントが作成されている場合、まずその暗黙的セーブポイントが作成される原因となった子作業領域をマージまたは削除しないかぎり、そのセーブポイントにロールバックできません。たとえば、第1.1.2項図1-2では、作業領域3(暗黙的セーブポイントSPcが作成された原因)がマージまたは削除されるまで、作業領域1内のユーザーはセーブポイントSP1にロールバックできません。

作業領域内にオープン状態のトランザクションがある場合、その作業領域はロールバックできません。作業領域のロールバックでは、作業領域構造は後で使用するために残され、作業領域内のデータのみが削除されます。(作業領域を完全に削除するには、RemoveWorkspaceプロシージャを使用します。詳細は、第1.1.6項を参照してください。)

1.1.4 マージまたはリフレッシュ操作前に行う競合の解消

子作業領域がマージされると、子作業領域内の行変更がその親作業領域に取り込まれます。子作業領域がリフレッシュされると、親作業領域内の行変更が子作業領域に取り込まれます。子作業領域と親作業領域の両方で行が変更されると、データの競合が発生します。マージまたはリフレッシュ操作が要求されると、競合は自動的に検出され、競合(xxx_CONF)ビューに表示されます。表ごとに1つの競合ビューがあります。詳細は、第5.45項を参照してください。このビューには、競合が発生している2つの作業領域内の行の列値が表示されます。

競合は、セッションに対し作業領域競合のコンテキストを設定してからResolveConflictsプロシージャを使用して、手動で解消する必要があります。それぞれの競合について、子作業領域の行を保存するか、親作業領域の行を保存するか、または共通のベース行を保存するか(行の元のデータ値を保存する(変更なし))を選択できます。マージ操作(MergeWorkspace)またはリフレッシュ操作(RefreshWorkspace)を実行する前に、競合を解消する必要があります。

ベースの行は、子作業領域での最初の更新または削除操作時では、現在参照できる行です。挿入操作の場合、挿入される行が親作業領域の祖先バージョンで以前に削除されていれば、ベースの行はその削除された行ですが、それ以外では、ベースの行は存在しません。親の行は、競合解消時では、親作業領域で現在参照できる行であり、子の行は、競合解消時では、子作業領域で現在参照できる行です。

データが存在しないことは競合ではありません。この場合は、xxx_DIFFビュー(第5.46項を参照)を使用して、ある作業領域での変更を削除することができます(他の作業領域に行が存在しないか行への変更が存在しない場合のみ)。

競合の一般的な解消手順は、次のとおりです。

  1. GotoWorkspaceプロシージャまたはSetConflictWorkspaceプロシージャを使用して、セッションに対し作業領域競合のコンテキストを設定します。

  2. xxx_CONFビュー(第5.45項を参照)を調べて、どのような競合が存在するかを確認します。

  3. BeginResolveプロシージャを実行します。

  4. 影響を受ける表と作業領域の組合せごとに1回、ResolveConflictsプロシージャを実行します。

  5. すべての競合を解消した後で、次のいずれかのプロシージャを実行します。

    • CommitResolve: 前述の手順のすべての変更を永続的な変更にする場合。(ただし、次の手順に示すとおり、MergeWorkspaceまたはRefreshWorkspaceプロシージャを実行するまでは、データベース内の変更は永続的な変更にはなりません。)

    • RollbackResolve: 前述の手順のすべての変更を廃棄する場合。(すべての変更を破棄する場合、次の手順は実行しないでください。)

  6. 標準のデータベース・コミット操作を行い、MergeWorkspaceまたはRefreshWorkspaceプロシージャを実行します。

1.1.5 作業領域のアクセス制限および制限解除

作業領域へのアクセス制限を設定および解除することにより、作業領域への読込みおよび書込みを制御できます。作業領域がアクセス制限されている場合は、作業領域へアクセスし、バージョン対応表内の行に変更を加えるためのユーザー権限が制限されます。作業領域へのアクセスは、アクセス不可、読取り専用、1ユーザーのみ(1WRITER)のいずれかのモードで制限できます。

作業領域へのアクセスを制限するには、FreezeWorkspaceプロシージャを使用します。作業領域へのアクセス制限を解除するには、UnfreezeWorkspaceプロシージャを使用します。

また、プロシージャによっては1つ以上の作業領域のアクセスを自動的に制限します。表1-1に、これらのプロシージャ、影響を受ける作業領域、およびアクセス制限される作業領域のモードを示します。(モードの値については、第4章FreezeWorkspaceプロシージャの説明を参照してください。)

表1-1 プロシージャのアクセス制限の結果

プロシージャ 作業領域およびモード

BeginResolve


指定された作業領域: 1WRITER

MergeWorkspace


指定された作業領域: NO_ACCESS

親作業領域: READ_ONLY

CompressWorkspace


指定された作業領域: NO_ACCESSLATEST以外のセーブポイントにセッションがないことも確認します)

CompressWorkspaceTree


指定された作業領域: NO_ACCESSLATEST以外のセーブポイントにセッションがないことも確認します)

CreateSavepoint


指定された作業領域: READ_ONLY

DeleteSavepoint


指定された作業領域: NO_ACCESS

CreateWorkspace


指定された作業領域: READ_ONLY

RemoveWorkspace


指定された作業領域: NO_ACCESS

RefreshWorkspace


指定された作業領域: READ_ONLY

親作業領域: READ_ONLY

RollbackResolve


指定された作業領域: 1WRITER

RollbackWorkspace


指定された作業領域: NO_ACCESS


1.1.6 作業領域の削除

作業領域は、RemoveWorkspaceプロシージャを使用して削除できます。RemoveWorkspaceを実行すると、作業領域内のデータがロールバックされ、その後、作業領域構造が削除されます。RemoveWorkspaceTreeプロシージャを使用すると、作業領域のツリー全体を削除できます。このプロシージャは、作業領域およびそのすべての子作業領域を削除します。作業領域内にユーザーがいる場合、その作業領域は削除できません。

1.1.7 Workspace Managerイベントの使用

数種類のWorkspace Manager操作をイベントとして取得し、Oracle Advanced Queuing(AQ)フレームワークを介してアプリケーションに通信できます。非同期通知、永続性、伝播、アクセス制御、履歴およびルールベースのサブスクリプションなど、AQのメッセージ機能をWorkspace Managerイベントに使用できます。

Workspace Managerイベントのサポートには、ALLOW_CAPTURE_EVENTS Workspace Managerシステム・パラメータ、SetCaptureEventプロシージャおよびWM_EVENTS_INFOメタデータ・ビューが含まれています。

Workspace Managerイベントおよびアプリケーションでの使用方法については、第2章を参照してください。

1.1.8 Workspace Managerの操作の自動コミット

デフォルトでは、Workspace Managerのほとんどの操作は、自律型データベース・トランザクションとして実行され、終了時にコミットされます。つまり、これらのトランザクションは、現行のデータベース・トランザクション内部でコールされ、コール側トランザクションのコンテキストをそのまま残し、Workspace Manager操作を実行した後、その操作を自動的にコミットし、コール側トランザクションのコンテキストに戻り、そのトランザクションを継続する独立したトランザクションです。このように動作するWorkspace Manager(DBMS_WM)サブプログラムには、オプションのauto_commitパラメータがあります。このパラメータのデフォルト値は、TRUEです。

たとえば、CompressWorkspaceプロシージャはデフォルトで自律型トランザクションを起動し、作業領域を圧縮し、圧縮操作をコミットした後、コール側トランザクションのコンテキストに戻り、現行のデータベース・トランザクションを継続します。

ただし、自律型トランザクションを起動するかわりに、コール側トランザクションのコンテキストで実行する場合は、auto_commitパラメータ値をFALSEに指定します。この場合、Workspace Manager操作は現行のデータベース・トランザクションの一部として実行されます。オープン状態の現行のトランザクションがない場合は、新しいトランザクションが起動されます。いずれの場合も、そのトランザクションがコミット操作によって終了するまで、Workspace Manager操作は有効になりません。たとえば、auto_commitパラメータをFALSEに指定してCompressWorkspaceプロシージャをコールすると、トランザクションがコミットされるまで作業領域は圧縮されません。トランザクションがロールバックされた場合、作業領域は圧縮されません。

auto_commitパラメータをFALSEに指定した場合は、トランザクションを明示的にコミットまたはロールバックする必要があることに注意してください。

auto_commitパラメータ値がTRUEで、オープン状態のトランザクションが存在する場合は、次の考慮点が適用されます。

  • CompressWorkspaceプロシージャおよびCompressWorkspaceTreeプロシージャでは、オープン状態のトランザクションが存在する場合、例外が発生します。

  • その他のすべてのWorkspace Managerプロシージャでは、修正が必要な表の親作業領域または子作業領域内にオープン状態のトランザクションが存在する場合、例外が発生します。

1.1.9 連続的にリフレッシュされる作業領域

連続的にリフレッシュされる作業領域とは、データ変更が親作業領域内でコミットされるか、別の子作業領域から親作業領域にマージされるたびに、親作業領域から自動的にリフレッシュされる作業領域です。連続的にリフレッシュされる作業領域の場合、RefreshWorkspaceプロシージャをコールする必要はありません。

作業領域ツリーのブランチにある作業領域は、連続的にリフレッシュできます。親作業領域が連続的にリフレッシュされるかどうかにかかわらず、子作業領域は連続的にリフレッシュされる作業領域にできます。ただし、親作業領域が連続的にリフレッシュされる作業領域である場合、その子作業領域も連続的にリフレッシュされる必要があります。

連続的にリフレッシュされる作業領域を作成するには、CreateWorkspaceプロシージャのコールでisrefreshedパラメータにTRUEを指定します。連続的にリフレッシュされる作業領域の作成に適用されるルールについては、CreateWorkspaceプロシージャの「使用上の注意」を参照してください。

連続的にリフレッシュされない作業領域を連続的にリフレッシュされるように変更するには、ChangeWorkspaceTypeプロシージャを使用します。

作業領域が連続的にリフレッシュされない場合は、親作業領域内のデータ変更を作業領域内で参照できるかどうかの確認が必要になるたびに、RefreshWorkspaceプロシージャをコールする必要があります。

1.1.10 複数の親を持つ作業領域

複数の親を持つ作業領域とは、2つ以上の親作業領域を持つ子作業領域です。作業領域は、最初は1つの親を持つ作業領域として作成されます。ただし、必要に応じて既存の作業領域に他の作業領域を親作業領域として追加し、複数の親を持つ作業領域にすることができます。複数の親を持つ作業領域では、すべての親作業領域と祖先作業領域のデータを参照でき、親作業領域とマージして親作業領域からリフレッシュできます。

図1-3は、図1-1の作業領域と同じ構造を示します。ただし、作業領域3は、作業領域1および作業領域4の2つの親を持つ作業領域である点が異なります。

図1-3 作業領域階層内で複数の親を持つ作業領域

図1-3の説明
「図1-3 作業領域階層内で複数の親を持つ作業領域」の説明

複数の親を持つ作業領域を、複数の親を持つリーフ作業領域と呼ぶこともあります。したがって、図1-3では、作業領域3は複数の親を持つリーフ作業領域です。複数の親を持つリーフ作業領域のすべての親作業領域に共通して最も近い祖先を、複数の親を含むルート作業領域と呼びます。図1-3では、LIVE作業領域は作業領域3の複数の親を含むルート作業領域です。リーフ作業領域の親として親作業領域を追加することにより形成される非循環有向グラフ(DAG)では、すべての作業領域を複数の親を持つグラフ作業領域と呼びます。図1-3では、作業領域1、作業領域4および作業領域3は、複数の親を持つグラフ作業領域です。

複数の親を持つ作業領域を作成できるのは、ALLOW_MULTI_PARENT_WORKSPACE Workspace Managerシステム・パラメータがONに設定されている場合のみです。また、連続的にリフレッシュされる作業領域を複数の親を持つ作業領域にするには、CR_WORKSPACE_MODE Workspace Managerシステム・パラメータをPESSIMISTIC_LOCKINGに設定する必要があり、連続的にリフレッシュされない作業領域を複数の親を持つ作業領域にするには、NONCR_WORKSPACE_MODE Workspace Managerシステム・パラメータをPESSIMISTIC_LOCKINGに設定する必要があります。Workspace Managerシステム・パラメータの詳細は、第1.5項を参照してください。

複数の親を持つ作業領域を作成するには、AddAsParentWorkspaceプロシージャを使用します。複数の親を持つ作業領域の親である作業領域を削除するには、RemoveAsParentWorkspaceプロシージャを使用します。複数の親を持つグラフ作業領域に対する権限を付与および取り消すには、それぞれGrantGraphPrivプロシージャおよびRevokeGraphPrivプロシージャを使用します。これらのプロシージャについては、第4章を参照してください。

Workspace Managerには、複数の親を持つ作業領域に関する情報を格納するために、次の静的データ・ディクショナリ・ビュー(第5章を参照)が用意されています。

1.1.11 バージョン対応表のインフラストラクチャ

EnableVersioningプロシージャを使用して表をバージョン対応にする場合、Workspace Managerは自動的に操作を実行し、DBA以外のユーザーには表示されないがWorkspace Manager自身の機能は許可されるデータ構造を作成します。Workspace Managerによって保持される情報には、静的データ・ディクショナリ・ビュー(第5章を参照)に格納されるものと、ユーザーがアクセスできないシステム・データ構造に格納されるものがあります。

表がバージョン対応の場合、Workspace Managerはその表名を<table-name>_LTという形式に変更し、この表に数列を追加してバージョニング・メタデータを格納します。SQL文に<table-name>LT表を指定しないように注意してください。元の表名(<table-name>)を継続して指定する必要があります。(バージョン対応表に関連付けられている<table_name>_LT表の名前を検索する必要がある場合や、<table_name>_LT表の有無をチェックして表がバージョン対応かどうかを調べる必要がある場合は、GetPhysicalTableNameファンクションを使用します。)

Workspace Managerは、元の表(<table-name>)にビューを作成するだけではなく、挿入、更新および削除操作用に、そのビューに対するINSTEAD OFトリガーも作成します。アプリケーションが、バージョン対応表内のデータを挿入、更新または削除するための文を実行すると、適切なINSTEAD OFトリガーが実際に操作を実行します。ビューにアクセスすると、作業領域のメタデータを使用して、ユーザーの現行の作業領域に関連する行バージョンのみ表示されます。

Workspace Managerでは、インフラストラクチャ・オブジェクトの作成時に元のオブジェクト名が使用されるため、オブジェクトの種類によっては、その名前に有効な長さの最大値が、Oracle Databaseで許可される最大値よりも短くなります。表1-2に、バージョン対応表および関連オブジェクトに対する名前の長さの最大値のガイドラインを示します。(第1.15項にある、特定の名前に対する予約語および予約文字の項も参照してください。)

表1-2 Workspace Managerの名前の長さのガイドライン

オブジェクトの種類 名前の文字数の最大値

25

28

索引

30(BeginDDLおよびCommitDDLプロシージャのコール間で索引が作成または変更された場合は26)

トリガー

27

制約

30(BeginDDLおよびCommitDDLプロシージャのコール間で制約が作成または変更された場合は26)


Workspace Managerでは、バージョン対応表でINSERT文、MERGE文またはUPDATE文を持つRETURNING句はサポートしていません。この制約の原因は、Workspace Managerによりバージョン対応表でINSTEAD OFトリガーを持つビューが作成されても、Oracle Databaseはビュー上で定義されたINSTEAD OFトリガーを持つRETURNING句をサポートしていないことにあります。

1.1.12 行バージョンおよび履歴コピーの作成

この項では、Workspace Managerが新しい行バージョンを作成し、古いバージョンの履歴コピーをメンテナンスするプロセスについて説明します。

新しい行バージョンは、次のいずれかを実行すると、バージョン対応表に作成されます。

  • 現行の作業領域で明示的セーブポイントを作成し、行を更新する。

  • 現行の作業領域の下に子作業領域を作成する(CreateWorkspaceプロシージャを使用)、したがって現行の作業領域に暗黙的セーブポイントを作成する。GotoWorkspaceプロシージャを実行して子作業領域に移動し、行を更新する。

表で履歴が有効になっているか、別のセーブポイントが作成されないかぎり、その後のあらゆる現行の行の更新で、現行の行バージョンが上書きされます。

  • 上書きを伴わない履歴を有効にする(VIEW_WO_OVERWRITE)と、現行の行バージョンを更新するたびに、変更とトランザクション時間に基づくタイムスタンプが適用された現行の行バージョンの完全なコピーが作成されます。このコピーは、新しい現行の行バージョンになります。

  • 上書きを伴う履歴を有効にする(VIEW_W_OVERWRITE)と、現行の行バージョンが更新されるたびに、現行の行バージョンが上書きされ、トランザクション・タイムスタンプが更新されます。

  • 作業領域にセーブポイントが作成されると、行への次の変更によって新しいバージョンが作成され、履歴サイクルが再び開始されます。

作業領域で作成される行バージョンは、MergeWorkspaceプロシージャまたはMergeTableプロシージャを実行しないかぎり、その作業領域から参照することができません。

子作業領域に対してMergeWorkspaceプロシージャを実行する場合、子作業領域の現行の行バージョンだけが親作業領域にマージされます。remove_workspaceパラメータをTRUEに指定すると、子作業領域が削除されるときに子作業領域のすべての中間行バージョンが削除されます。子作業領域に作成されたすべての中間バージョンを保持するには、remove_workspaceパラメータをFALSE(デフォルト)にする必要があります。

子作業領域でCompressWorkspaceプロシージャを実行して中間セーブポイントを削除する場合、その行バージョンの関連履歴コピーも削除することができます。これらのコピーを削除しない場合、これらのコピーは次のバージョンに関連付けられます。

中間行バージョンは、読取り専用アクセスのためにのみ選択できます。読取り専用アクセスのために中間行バージョンを選択するには、まだその作業領域に移動していない場合は移動し(GotoWorkspaceプロシージャ)、GotoDateプロシージャを実行してセッション・コンテキストを履歴時間に設定するか、GotoSavepointプロシージャを実行してセッション・コンテキストを特定のセーブポイントに設定します。後続のSELECT文は、読取り専用アクセスのために、指定された日付またはセーブポイントの時点で最新の行バージョンを選択します。

1.1.13 Workspace Managerのスキーマ、メタデータおよびパッケージ

Workspace Managerは、WMSYSという名前のユーザーを作成します。WMSYSスキーマは、Workspace Managerのすべてのメタデータ情報を格納するために使用します。DBMS_WMパブリック・シノニムを持つPL/SQLパッケージには、Workspace Managerサブプログラム(プロシージャおよびファンクション)が含まれています。

PUBLICユーザー・グループには、次の権限が付与されます。

  • Workspace Managerの静的データ・ディクショナリ・ビューに対するSELECT権限(第5章を参照)

  • DBMS_WMパッケージに対するEXECUTE権限(第4章を参照)

1.2 Workspace Managerのセッション・コンテキスト情報

Workspace Manager操作は、標準のOracleセッションで実行します。(セッションとは、ユーザー・プロセスを使用した、ユーザーからOracleインスタンスへの特定の接続で、ユーザーが接続した時点から、接続を切断するかデータベース・アプリケーションが終了する時点まで続きます。)Workspace Managerの操作を実行すると、セッション・コンテキストに関連する情報が自動的に記録されます。

セッション・コンテキスト情報には、作業領域名およびコンテキスト値が含まれます。この情報により、作業領域内のセッションに表示できるデータ、およびセッションに入ることができる作業領域が決まります。コンテキスト値は、次のいずれかです。

セッション・コンテキストに関する情報は、GetSessionInfoプロシージャを使用して取得できます。この情報を取得すると、GotoWorkspace操作、GotoSavepoint操作およびGotoDate操作を組み合せて実行した後など、セッションの場所(作業領域およびコンテキスト)を知る必要がある場合に有効です。

1.3 Workspace Managerでのロック管理

通常のOracleデータベース・トランザクションが提供するロックの他に、Workspace Managerは2種類のバージョン・ロックを提供します。このロックの主な目的は、親作業領域と子作業領域の間における行の競合を排除することにある。ロックは、作業領域、セッションまたは指定行に対して、あるいはそれらを組み合せて使用可能にできます。

作業領域およびセッションのロックは、作業領域またはセッションの存続期間中、あるいは作業領域がマージまたはロールバックされるまで持続します。

データベースのロックと同様に、Workspace Managerのロックには排他ロックまたは共有ロックがあります。

作業領域排他ロックとバージョン排他ロックは、ユーザーがデータ値を変更できるかどうかを制御する形式の排他ロックですが、排他ロックとは異なり、競合の発生は回避されません。作業領域排他ロックは、ロックを設定したユーザーのみが現行の作業領域内で値を変更できるように行をロックします。ただし、他の作業領域の他のユーザーは値を変更できます。バージョン排他ロックは、ロックを設定したユーザーのみが値を変更できる(および、そのユーザーがどの作業領域でも操作できる)ように行をロックします。どの作業領域でも他のユーザーは値を変更できません。

表1-3に、特定の作業領域内で特定のユーザーがロックした行を、どの作業領域のどのユーザーが変更できるかを示します。たとえば、表1-3の最初の2つの項目は、行が共有(S)ロックされていると、その行がロックされた作業領域のユーザーはだれでもその行を変更できますが、他の作業領域内のユーザーはその行を変更できないことを意味します。

表1-3 Workspace Managerのロック・モードとデータ変更の可否

ロック・モード ユーザー ユーザーの作業領域 変更可能/不可

共有(S)

すべてのユーザー

行がロックされた作業領域

可能

共有(S)

すべてのユーザー

行がロックされたのとは異なる作業領域

不可

排他(E)

行をロックしたユーザー

行がロックされた作業領域

可能

排他(E)

行をロックしたユーザー

行がロックされたのとは異なる作業領域

不可

排他(E)

行をロックしたのとは異なるユーザー

すべての作業領域

不可

作業領域排他(WE)

行をロックしたユーザー

すべての作業領域

可能

作業領域排他(WE)

行をロックしたのとは異なるユーザー

行がロックされたのとは異なる作業領域

可能

作業領域排他(WE)

行をロックしたのとは異なるユーザー

行がロックされた作業領域

不可

バージョン排他(VE)

行をロックしたユーザー

すべての作業領域

可能

バージョン排他(VE)

行をロックしたのとは異なるユーザー

すべての作業領域

不可


行をロックすることは、作業領域のマージ操作、リフレッシュ操作およびロールバック操作には影響しませんが、これらの操作後、その行で何ができるかに影響します。操作を実行する前に、作業領域権限を使用して、FreezeWorkspaceプロシージャをコールし、作業領域xxx_LOCKビュー(第5.48項を参照)を確認することにより、これらの作業領域操作を制御できます。

xxx_LOCK静的データ・ディクショナリ・ビュー(第5.48項を参照)には、各バージョン対応表のロックに関する情報が含まれています。

参照整合性制約を持つ表のDML操作でのWorkspace Managerロック操作の詳細は、第1.9.1.1項を参照してください。

1.3.1 排他ロックと行バージョン

子作業領域内での更新操作に対する排他ロックのタイミングは、親作業領域内で、どの行のどのバージョン(バージョンがある場合)を更新できるかに影響します。たとえば、表がLIVE作業領域内でバージョン対応している場合、元の各行はバージョン0に割り当てられます。LIVE作業領域の子としてW1の名前の作業領域が作成されると想定します。作業領域W1の作成時、次の動作が発生します。

  • バージョン1はLIVE作業領域に割り当てられる(ただし、追加の行は作成されない)。

  • バージョン2は作業領域W1に割り当てられる(ただし、追加の行は作成されない)。作業領域W1内の問合せは、引き続きLIVE作業領域内にある行のバージョン0に戻されます。

この例を使用して、作業領域W1内のユーザーが、更新される前の行に排他ロックをかけた場合、作業領域W1内のユーザーのみがこの行を更新できます。具体的には、次のようになります。

  • その行のバージョン0がロックされ、ロックが解除されるまで、他作業領域からその行へのすべての更新を排除します。

  • バージョン0は対象作業領域の現在の物理行であるため、作業領域W1(またはW1の子孫作業領域)からこのロックをかけることができます。

  • 作業領域W1のユーザーがこの行を更新すると、作業領域W1およびそのすべての子作業領域からのみ参照できる新しい行(バージョン2)が作成されます。

ただし、この行がLIVE作業領域内でロックされていない場合、作業領域W1内のユーザーが行を更新した後でこの行に排他ロックをかけた場合、LIVE作業領域内のユーザーはこの行を更新できます。具体的には、次のようになります。

  • 作業領域W1およびそのすべての子作業領域からのみ参照できる新しい行(バージョン2)が作成されます。

  • バージョン2の行がロックされます。ロックをかけたユーザー以外の作業領域W1内のユーザー、または作業領域W1のすべての子作業領域内のユーザーは、行を更新したり、行の新しいバージョンを作成したりできません。

  • LIVE作業領域内の行のバージョン0はロックされません。LIVE作業領域内またはW1の兄弟作業領域内のユーザーが行を更新した場合、行の新しいバージョン(バージョン1)が作成されます。(バージョン0は、すでに作業領域W1内のユーザーにとって現行バージョンではないため、ロックされません。かわってバージョン2がその作業領域内の現行バージョンになっています。)

つまり、更新後の排他ロックは、作業領域ツリー内のロックされた作業領域の上位にある作業領域内の行、または作業領域ツリーの他ブランチ内の作業領域内の行の以前のバージョンをロックしません。

1.4 Workspace Managerでの権限管理

Workspace Managerには、標準のOracleデータベース権限とは異なる一連の権限があります。Workspace Managerの作業領域レベルの権限xxx_WORKSPACE 形式の名前が付いている)によって、指定された作業領域に対して影響を与えることができます。また、システム・レベルの権限xxx_ANY_WORKSPACE 形式の名前が付いている)によって、任意の作業領域に対して影響を与えることができます。

表1-4に、Workspace Managerの権限を示します。

表1-4 Workspace Managerの権限

権限 説明

ACCESS_WORKSPACE

指定された作業領域に移動できます。その他のすべての権限には、ACCESS_WORKSPACE権限またはACCESS_ANY_WORKSPACE権限が必要です。

ACCESS_ANY_WORKSPACE

任意の作業領域に移動できます。その他のすべての権限には、ACCESS_WORKSPACE権限またはACCESS_ANY_WORKSPACE権限が必要です。

CREATE_WORKSPACE

指定された作業領域内で子作業領域を作成できます。

CREATE_ANY_WORKSPACE

任意の作業領域内で子作業領域を作成できます。

REMOVE_WORKSPACE

指定された作業領域を削除できます。

REMOVE_ANY_WORKSPACE

任意の作業領域を削除できます。

MERGE_WORKSPACE

指定された作業領域内の変更を、その親作業領域にマージできます。

MERGE_ANY_WORKSPACE

任意の作業領域内の変更を、その親作業領域にマージできます。

ROLLBACK_WORKSPACE

指定された作業領域内の変更をロールバックできます。

ROLLBACK_ANY_WORKSPACE

任意の作業領域内の変更をロールバックできます。

FREEZE_WORKSPACE

指定された作業領域へのアクセスを制限したりアクセス制限を解除したりできます。

FREEZE_ANY_WORKSPACE

任意の作業領域へのアクセスを制限したりアクセス制限を解除したりできます。


各権限は、Grant Optionの有無にかかわらず付与できます。Grant Optionによって、権限が付与されたユーザーはその権限を他のユーザーに付与できます。

WM_ADMIN_ROLEロールには、Grant Optionが付いたすべてのWorkspace Manager権限があります。デフォルトでは、データベース管理者(DBAロール)にWM_ADMIN_ROLEロールが付与されます。そのため、どのユーザーにどの権限を付与するかを決定した後で、DBAにそれらの権限を付与させるか、またはDBAにWM_ADMIN_ROLEロールを1人以上の選択されたユーザーに付与させた後で、これらのユーザーから権限を付与させます。

GrantWorkspacePrivプロシージャおよびGrantSystemPrivプロシージャは、それぞれ作業領域レベルの権限およびシステム・レベルの権限を付与するために使用します。

RevokeWorkspacePrivプロシージャおよびRevokeSystemPrivプロシージャは、それぞれ作業領域レベルの権限およびシステム・レベルの権限を取り消すために使用します。これらのプロシージャを使用するには、指定された権限を指定されたユーザーから取り消すための十分な権限が必要です。権限を付与したユーザーは、その権限を取り消すことができます。

1.5 Workspace Managerのシステム・パラメータ

このリリースのWorkspace Managerには、WM_ADMIN_ROLEロール(第1.4項を参照)を持つユーザーがデータベースに対してグローバルなWorkspace Manager固有設定を規定できるように、一連のシステム・パラメータが用意されています。(これらのWorkspace Managerシステム・パラメータは、Oracle初期化パラメータではありません。Workspace Managerシステム・パラメータを設定するには、SetSystemParameterプロシージャを使用する必要があります。第4章を参照してください。)

システム・パラメータを設定するには、SetSystemParameterプロシージャを使用します。現在のシステム・パラメータ設定を取得するには、GetSystemParameterプロシージャを使用します。これらのプロシージャについては、第4章を参照してください。

表1-5に、Workspace Managerのシステム・パラメータを示します。

表1-5 Workspace Managerのシステム・パラメータ

パラメータ名

ADD_UNIQUE_COLUMN_TO_HISTORY_VIEW

ONに設定すると、バージョン対応表のxxx_HISTビュー(第5.47項を参照してください。)に列を追加します。有効期間サポートを伴うバージョン対応表(第3章を参照してください。)では、WM_ROWID(rowid)およびWM_FLAG(整数) が追加されます。有効期間サポートを伴わないバージョン対応表では、WM_ROWID列のみ追加されます。これらの列は、xxx_HISTの各行を一意に識別するために使用できます。有効期間サポートを伴うバージョン対応表の場合は、いずれかのWHERE句のWM_ROWID列およびWM_FLAG列を使用する必要があります。

OFF(デフォルト)に設定すると、xxx_HISTビューに列を追加しません。

ALLOW_CAPTURE_EVENTS

ONに設定すると、Workspace Managerイベント(第2章を参照)を取得できます。このパラメータをONに設定すると、内部のWorkspace Manager処理操作が付加的に実行されるので、イベントを取得する計画がないかぎり、パフォーマンスを向上するために値をONに設定しないでください。

OFF(デフォルト)に設定すると、Workspace Managerイベントを取得できません。

ALLOW_MULTI_PARENT_WORKSPACES

ONに設定すると、複数の親を持つ作業領域(第1.1.10項を参照)を作成できます。このパラメータをONに設定すると、内部のWorkspace Manager処理操作が付加的に実行されるので、複数の親を持つ作業領域を使用する計画がないかぎり、パフォーマンスを向上するために値をONに設定しないでください。

OFF(デフォルト)に設定すると、複数の親を持つ作業領域を作成できません。

ALLOW_NESTED_TABLE_COLUMNS

ONに設定すると、ネストした表の列を含む表をバージョン対応にすることができます。このパラメータをONに設定すると、内部のWorkspace Manager処理操作が付加的に実行されるので、ネストした表の列を含む表をバージョン対応にする計画がないかぎり、パフォーマンスを向上するために値をONに設定しないでください。

OFF(デフォルト)に設定すると、ネストした表の列を含む表をバージョン対応にすることはできません。

COMPRESS_PARENT_AFTER_REMOVE

ON(デフォルト)に設定すると、RemoveWorkspace操作の後、またはremove_workspaceパラメータをtrueに設定した状態でのMergeWorkspace操作の後、暗黙的にCompressWorkspaceプロシージャをコールして親作業領域を圧縮します。

OFFに設定すると、前述の場合も親作業領域を圧縮しません。

CR_WORKSPACE_MODE

OPTIMISTIC_LOCKINGでは、2つ以上の連続的にリフレッシュされる作業領域内でレコードを編集できます。親作業領域と子作業領域の間に違いが発生すると、レコードは競合しているとみなされます。競合を解消しなければ、子作業領域をマージまたはリフレッシュできません。

PESSIMISTIC_LOCKINGでは、2つ以上の連続的にリフレッシュされる作業領域内でレコードを編集できません。この設定では、親作業領域と子作業領域の間に競合がないことが保証されます。

OPTIMISTIC_LOCKINGは、新規インストールではデフォルトですが、リリース9.2.0.2以前のバージョンからのアップグレードではPESSIMISTIC_LOCKINGがデフォルトになります。

FIRE_TRIGGERS_FOR_NONDML_EVENTS

ON(デフォルト)に設定した場合は、後からSetTriggerEventsプロシージャで特定のトリガーについてオーバーライドされないかぎり、作業領域の非DML操作(MergeWorkspaceMergeTableなど)が実行されると、バージョン対応表に対するユーザー定義トリガーが実行されます。

OFFに設定した場合は、後からSetTriggerEventsプロシージャで特定のトリガーについてオーバーライドされないかぎり、作業領域の非DML操作(MergeWorkspaceMergeTableなど)が実行されても、バージョン対応表に対するユーザー定義トリガーが実行されません。

KEEP_REMOVED_WORKSPACE_INFO

ONに設定すると、削除されたすべての作業領域の情報を保存します。この情報はDBA_REMOVED_WORKSPACESビュー、ALL_REMOVED_WORKSPACESビューおよびUSER_REMOVED_WORKSPACESビューで見ることができます。また、ONに設定すると、xxx_HISTビューに2つの新しい列を追加します。(第5.47項を参照してください。)WM_CREATEWORKSPACEIDおよびWM_RETIREWORKSPACEIDを使用して、どの作業領域から行がマージされたか、および作業領域を削除または変更した行をマージした作業領域を確認できます。

OFF(デフォルト)に設定すると、削除された作業領域についての情報を保存しません。

NONCR_WORKSPACE_MODE

OPTIMISTIC_LOCKING(新規インストールおよびアップグレードの両方でデフォルト)では、2つ以上の連続的にリフレッシュされない作業領域内でレコードを編集できます。親作業領域と子作業領域の間に違いが発生すると、レコードは競合しているとみなされます。競合を解消しなければ、子作業領域をマージまたはリフレッシュできません。

PESSIMISTIC_LOCKINGでは、2つ以上の連続的にリフレッシュされない作業領域内でレコードを編集できません。この設定では、親作業領域と子作業領域の間に競合がないことが保証されます。

NUMBER_OF_COMPRESS_BATCHES

1〜1000の数値に設定して、batch_sizeパラメータの値がPRIMARY_KEY_RANGEで、NUMBER、INTEGER、DATEまたはTIMESTAMP型の主キー列のヒストグラム統計ではなく一般統計が使用可能な場合に使用されるバッチ数を識別します。(batch_sizeパラメータを持つDBMS_WMサブプログラムについては、リファレンス情報を参照してください。)

ROW_LEVEL_LOCKING

ONに設定すると、MergeTableMergeWorkspaceまたはRefreshWorkspace操作の間マージまたはリフレッシュされる必要があるすべての行に行レベル・ロックを行います。これにより、同じ親を持つ作業領域に対し、これらのプロシージャをパラレルで実行できます。これにより、複数の作業領域またはセッション・スレッドが、マージ・リクエストまたはリフレッシュ・リクエストを同じ表に対して同時に発行できるようになります。表のリストを含む単一のマージ操作またはリフレッシュ操作はパラレル化されません。(ただし、パラレル・マージ操作やパラレル・リフレッシュ操作は、有効期間サポートを伴わない表に対してのみ、または連続的にリフレッシュされない作業領域に対してのみ、サポートされます。)ON設定は、連続的にリフレッシュされる作業領域に対して、またはマージやリフレッシュが必要ないずれかの表で有効期間サポートが有効になっている場合に、無効になります。

OFF(デフォルト)に設定すると、すべての作業領域操作に対し作業領域レベルのロックを行います。この設定により、同じ親作業領域での操作中、MergeTableMergeWorkspaceおよびRefreshWorkspace操作はパラレルで実行できません。

TARGET_PGA_MEMORY

メモリーの最大容量を表す数。バイトで指定され、MergeTableMergeWorkspaceまたはRefreshWorkspace操作の間、メモリーへの行の選択に使用されます。デフォルトは8388608(8MB)。Workspace Managerはこの値を使用して、一度にフェッチする行の最適数を確認します。この値は、他のデータベースのプロセスに使用されるメモリー容量には影響しません。内部作業領域操作にのみ影響します。

UNDO_SPACE

UNLIMITEDを含む文字列(制限を指定しない場合)、またはWorkspace Manager操作に使用可能なUNDO領域の最大バイト数を指定します。たとえば、1 MBの場合は'1048576'に設定します。Workspace Managerは、UNDO_SPACEの値を超えないように1回のトランザクションで使用されるUNDO領域を最小限に抑えようとします。

UNDO_SPACEシステム・パラメータの値は、EnableVersioningプロシージャのコールでundo_spaceパラメータを指定してオーバーライドできます。

USE_SCALAR_TYPES_FOR_VALIDTIME

ONに設定すると、Workspace Managerは(WM_PERIOD型の)WM_VALID列を使用するかわりに、TIMESTAMP WITH TIME ZONE型のWM_VALIDFROM列およびWM_VALIDTILL列を使用して、有効期間サポートを伴うバージョン対応表に作成されたビューに有効期間を示します。(WM_PERIOD型の詳細は、第3.2項を参照してください。

OFF(デフォルト)に設定すると、Workspace Managerは(WM_PERIOD型の)WM_VALID列を使用して、有効期間サポートを伴うバージョン対応表に作成されたビューに有効期間を示します。

このパラメータは、これ以降にバージョン対応にする表にのみ影響します。既存のバージョン対応表のビューには影響しません。既存のバージョン対応表のビューを変更するには、AlterVersionedTableプロシージャを使用して、alter_optionパラメータ値にUSE_SCALAR_TYPES_FOR_VALIDTIMEまたはUSE_WM_PERIOD_FOR_VALIDTIMEを指定します。

USE_TIMESTAMP_TYPE_FOR_HISTORY

ON(デフォルト)に設定すると、Oracleデータベースがリリース1(9.0.1)以上の場合に、Workspace ManagerではCREATETIME列とRETIRETIME列にTIMESTAMP WITH TIME ZONE型が使用されます。(この型の使用方法については、第B.3項を参照してください。)

OFFに設定すると、Workspace ManagerではCREATETIME列とRETIRETIME列にDATE型が使用されます。


1.6 インポートおよびエクスポートの考慮点

Workspace Managerでは、バージョン対応表のインポートおよびエクスポートがサポートされています。全データベースのインポートおよびエクスポート、およびWorkspace Managerプロシージャを使用した作業領域レベルのインポートおよびエクスポートの2つの方法があります。その他のエクスポート・モード(スキーマ、表、パーティション・レベルなど)はサポートされません。

バージョン対応データベースには、Oracleユーティリティを使用した全データベースのインポート操作およびエクスポート操作を実行できます。ただし、その場合は、次の考慮点および制限事項が適用されます。

作業領域レベルのエクスポート操作では、各バージョン対応表を作業領域レベルでエクスポートできます。1つのデータベースから他データベースへバージョン対応表をエクスポートする手順は、次のとおりです。

  1. Exportプロシージャをコールして、ステージング表(たとえば、t1)へエクスポートする必要があるすべてのデータを格納します。特定の作業領域、セーブポイントまたは時点から参照できるすべてのデータ、または特定の作業領域内で修正されたデータのみをエクスポートできます。詳細は、第4章「Exportプロシージャ」を参照してください。

    バージョン対応表に対して複数の作業領域をエクスポートするには、Exportプロシージャを再度コールして、元のステージング表およびエクスポートする必要がある新規作業領域を指定します。バージョン非対応の表にデータをインポートする場合、versioned_dbパラメータにFALSEを指定します。

  2. Oracle Exportユーティリティを使用して、ステージング表(たとえば、t1)をエクスポートします。

  3. Oracle Importユーティリティを使用して、宛先データベースへステージング表(たとえば、t1)をインポートします。

  4. バージョン対応表へインポートする場合、Importプロシージャをコールし、ソース・データベース上にデータが常駐する作業領域、およびデータを格納する作業領域を指定して、ステージング表からバージョン対応表へデータを移動します。

    ステージング表の構造は、バージョン対応表と一致する必要があります。デフォルトでは、インポート・プロシージャを正常に完了する前に、有効なすべての制約を検証する必要があります。

1.7 バージョン対応表へのバルク・ロード

SQL*Loaderを使用するとバージョン対応表へのバルク・ロードを実行できますが、Workspace Managerの特殊プロシージャもコールする必要があり、ある程度の制限が適用されます。最新バージョンの作業領域またはルート・バージョン(バージョン番号0のLIVE作業領域)に対して、データのダイレクト・パスによるバルク・ロードと従来型パスによるバルク・ロードの両方を実行できます。ルート・バージョンは他のすべてのバージョンの祖先であるため、ルート・バージョンのデータは他のすべての作業領域から参照可能です(LIVE以外の作業領域に更新済のデータがない場合)。

バージョン対応表に対してバルク・ロードを実行する一般手順は、次のとおりです。

  1. GetBulkLoadVersionファンクションをコールして、バルク・ロード後にタグ付けが必要なデータに使用する予約済バージョン番号をフェッチします。バージョン対応表にバルク・ロードしたすべてのデータは、バージョン番号でタグ付けする必要があります。バージョン番号は、データの最終的な宛先、つまり、作業領域の最新バージョンまたはルート・バージョンによって決まります。GetBulkLoadVersionファンクションから戻されるバージョン番号をSQL*Loader制御ファイル内で使用します。手順3を参照してください。

  2. BeginBulkLoadingプロシージャをコールして、表をバルク・ロード用に準備します。バージョン対応表へのデータのバルク・ロード中は、表に対するDML操作も作業領域操作も実行できませんが、この表に関係しない作業領域操作は実行できます。BeginBulkLoadingプロシージャにより、この表に対する無効な操作の実行が回避されます。

  3. SQL*Loaderを使用してバルク・ロードを実行します。制御ファイルの1行のみを変更し、<table_name>_LT名を指定して、手順1でフェッチされたバージョン番号を挿入します。たとえば、既存の制御ファイルに次の行があると仮定します。

    Load data  into table departments (name, loc)
    

    手順1でフェッチされたバージョン番号が5であれば、制御ファイル内でバージョン対応表へのバルク・ロードに関する行を次のように変更する必要があります。

    Load data into table departments_LT (name, loc, version constant '5')
    

    これにより、バルク・ロードされるすべての行が確実にバージョン5でタグ付けされ、各行ではWorkspace Manager固有の他の列が確実にNULL値となります。表が履歴オプション指定のあるバージョン対応だった場合は、作成時刻と削除または変更時刻を<table_name>_LTcreatetime列とretiretime列にバルク・ロードできます。

  4. バルク・ロード処理を完了するには、CommitBulkLoadingプロシージャをコールしてバルク・ロードによる変更をコミットするか、RollbackBulkLoadingプロシージャをコールしてバルク・ロードによる変更をロールバックします。

バルク・ロードによる変更をコミットすると、Workspace Managerでは必要な作業領域内およびバージョン内でデータが更新されていることが確認されます。デフォルトでは、バルク・ロードされたデータは、表に対して定義済の一意制約または参照制約に対してそれぞれチェックされ、バルク・ロードされた行のうち、いずれかの制約に違反する行はCommitBulkLoadingプロシージャのパラメータに指定した廃棄表に移動します。重複(つまり、バルク・ロードされたデータのうち主キー列に同じ値を持つレコード)の有無をチェックするように指定した場合は、重複レコードのうち最小のROWID値を持つレコードのみが表にロードされ、他のレコードは廃棄表に移動します。

現行のリリースの場合、バージョン対応表を使用したバルク・ロードには次の制限が適用されます。

1.8 バージョン対応表と関連するDDL操作

バージョン対応表に対してデータ定義言語(DDL)操作を実行するには、DDL操作の前後に特別なWorkspace Managerプロシージャを使用し、Workspace Managerによって作成される特別な表の名前を指定する必要があります。表または表を参照する索引またはトリガーに対して、通常の方法でDDL操作を実行することはできません。たとえば、EMPLOYEESという名前のバージョン対応表に列を追加すると、ALTER TABLE EMPLOYEES ADDcolumn-name data-type)形式の文は入力できません。

これらの要件は、Workspace Managerのバージョニング・メタデータを更新して、DDL変更が反映されるようにするためのものです。そのため、バージョン対応表に影響するDDL操作の前にBeginDDLプロシージャをコールし、DDL操作の後にCommitDDLまたはRollbackDDLプロシージャをコールする必要があります。BeginDDLプロシージャは、<table-name>_LTSSスケルトンを表す)形式の名前で空の一時表を作成します。実際のDDL文は、一時表<table-name>_LTSを指定する必要があり、<table-name>または<table-name>_LT 名は指定できません。The CommitDDLおよびRollbackDDLプロシージャを使用して、一時表<table-name>_LTSを削除します。


注意:

このプロシージャの例外は、既存のバージョン対応表に有効期間のサポートを追加することです。有効期間のサポートを追加するには、AlterVersionedTableプロシージャを使用します。第3.11項を参照してください。

バージョン対応表と関連する次のDDL操作がサポートされています。

バージョン対応表で、標準、ビットマップ、ファンクション標準、ファンクション・ビットマップおよびドメインの索引を作成できます。バージョン対応表ではパーティション索引、逆索引、または結合索引は作成または削除できません。(ただし、パーティション索引、逆索引または結合索引を持つバージョン対応表は作成または削除できます。)

サポートされていないDDL操作を実行すると、変更は行われず、CommitDDLプロシージャによって例外が発生する場合があります。

ドメイン索引に対して、バージョン対応表が関連するDDL操作を実行する場合(たとえば、表にRツリー索引を作成する場合)は、CREATE TABLE権限が必要です。

レプリケーション環境でバージョン対応表に対してDDL操作を実行する必要がある場合のガイドラインは、第C.3項を参照してください。

Oracle Label Security(OLS)環境でバージョン対応表に対してDDL操作を実行する必要がある場合は、スケルトン(_LTS)表でSA_POLICY_ADMINパッケージのapply_table_policyremove_table_policyenable_table_policyおよびdisable_table_policyプロシージャを使用することができ、変更は、バージョン対応表に転送されます。

例1-1に、COLA_MARKETING_BUDGET_LTSという名前の特別な表を使用して、COMMENTS列をCOLA_MARKETING_BUDGET表に追加する場合に必要な文を示します。この例には、列の追加を示すDESCRIBE文も含まれています。

例1-1 バージョン対応表のDDL操作

EXECUTE DBMS_WM.BeginDDL('COLA_MARKETING_BUDGET');
ALTER TABLE cola_marketing_budget_lts ADD (comments VARCHAR2(100));
DESCRIBE cola_marketing_budget_lts;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PRODUCT_ID                                NOT NULL NUMBER
 PRODUCT_NAME                                       VARCHAR2(32)
 MANAGER                                            VARCHAR2(32)
 BUDGET                                             NUMBER
 COMMENTS                                           VARCHAR2(100)

EXECUTE DBMS_WM.CommitDDL('COLA_MARKETING_BUDGET');

例1-1ALTER TABLE文には、BeginDDLプロシージャによって作成されるCOLA_MARKETING_BUDGET_LTS表が指定されています。CommitDDLプロシージャによって、COLA_MARKETING_BUDGET表に変更が適用され、COLA_MARKETING_BUDGET_LTS表が削除されます。

1.9 Workspace Managerによる制約のサポート

この項では、データベース制約の使用に関連するWorkspace Managerの考慮事項について説明します。

1.9.1 参照整合性のサポート

バージョン対応表には、CASCADEオプションおよびRESTRICTオプションを使用した制約などの参照整合性制約を定義できます。ただし、その場合は、次の考慮点および制限事項が適用されます。

  • 参照整合性関係における親表がバージョン対応である場合、その子表もバージョン対応である必要があります。(子表は制約が定義されている表です。)たとえば、作成後に外部キー制約(各EMPLOYEE行内のdept_id値が、DEPARTMENT行内の既存のdept_id値と一致する必要がある)が追加された、次のようなEMPLOYEE表およびDEPARTMENT表の定義について考えてみます。

    CREATE TABLE employee (
      employee_id NUMBER,
      last_name VARCHAR2(32),
      first_name VARCHAR2(32),
      dept_id NUMBER);
    CREATE TABLE department (
      dept_id NUMBER,
      name VARCHAR2(32);
    ALTER TABLE employee ADD CONSTRAINT emp_forkey_deptid
      FOREIGN KEY (dept_id) REFERENCES department (dept_id)
      ON DELETE CASCADE;
    

    この例では、DEPARTMENTが参照整合性関係における親、およびEMPLOYEEが子とみなされます。また、DEPARTMENTがバージョン対応である場合は、EMPLOYEEもバージョン対応である必要があります。この関係の定義では、DEPARTMENT行が削除されると、EMPLOYEE表内にあるそのすべての子である行が削除されます(連鎖的な削除操作)。

  • 参照整合性関係における子表は、その親表がバージョン対応でなくてもバージョン対応にすることができます。

  • 子表の外部キーは親表の主キーを参照する必要があります。

  • 親表の主キーの値は更新できません。たとえば、DEPARTMENTが親表でEMPLOYEEが子表の場合、DEPARTMENTのdepartment IDは変更できません。

  • マルチレベルの参照整合性制約はバージョン対応表で適用されます。たとえば、表EMPLOYEE(emp_id、dept_id)には、部門IDが表DEPARTMENT(dept_id、dept_name、loc_id)に存在する必要があるという制約があり、表DEPARTMENT(dept_id、dept_name、loc_id)に、位置IDが表LOCATION(loc_id、loc_name)に存在する必要があるという制約があります。ただし、関連するすべての参照整合性制約が制限ルールを伴わないかぎり、マルチレベルの参照整合性制約と関連するすべての表を、まとめてバージョン対応およびバージョン非対応にする必要があります。関連するすべての制約に制限ルールがある場合は、表をまとめてバージョン対応にできます。または子表、親表の順で、1つずつバージョン対応にできます。表名は、カンマで区切ったリストとしてEnableVersioningプロシージャおよびDisableVersioningプロシージャに渡す必要があります。

Workspace Managerは、ALL_WM_RIC_INFO静的データ・ディクショナリ・ビューおよびUSER_WM_RIC_INFO静的データ・ディクショナリ・ビュー(第5章を参照)を使用して、参照整合性のサポートに関連する情報を保持します。

2つの表が関連する参照整合性制約を追加、削除、使用可能または使用禁止にする必要がある場合は、表をバージョン対応にする前に、これらの操作を実行すると便利です。ただし、次の手順を実行すると、2つのバージョン対応表が関連する参照整合性制約を追加、削除、使用可能または使用禁止にできます。

  1. 親表を指定して、DDLセッションを開始します。

  2. 子表を指定して、DDLセッションを開始します。

  3. 子表の<table-name>_LTS表を変更して、外部キー制約を追加します。(<table-name>_LTS表およびバージョン対応表に対するDDL操作の実行については、第1.8項を参照してください。)

  4. 子表を指定して、DDL変更をコミットします。

  5. 親表を指定して、DDL変更をコミットします。

外部キー制約の追加例を例1-2に示します。EMPLOYEE表およびDEPARTMENT表はバージョン対応で、次のとおり定義されていると想定します。

EMPLOYEE(emp_id number  primary key, dept_id number)
DEPARTMENT(dept_id number  primary key, dept_name varchar2(30))

例1-2 参照整合性制約の追加

-- Begin a DDL session on the parent table.
DBMS_WM.BeginDDL('DEPARTMENT');

-- Begin a DDL session on the child table.
DBMS_WM.BeginDDL('EMPLOYEE');

-- Add the constraint between EMPLOYEE_LTS and DAPATMENT_LTS.
ALTER TABLE employee_lts ADD CONSTRAINT employee_fk FOREIGN KEY (dept_id)
   REFERENCES department_lts(dept_id);

-- Commit DDL on the child table (transfers the constraint on employee_lts
-- to employee and drops employee_lts).
EXECUTE DBMS_WM.CommitDDL('EMPLOYEE');

-- Commit DDL on the parent table (drops the department_lts table).
EXECUTE DBMS_WM.CommitDDL('DEPARTMENT');

DDLセッション中(BeginDDLプロシージャをコールした場合)、1つの表がバージョン対応で、もう1つの表がバージョン非対応の場合、2つの表が関連する参照整合性制約を追加、削除、使用可能または使用禁止にできません。両方の表が、バージョン対応である必要があります。

1.9.1.1 参照整合性制約を持つ表のDML操作でのロック

参照整合性制約を持つバージョン対応表に対してデータ操作言語(DML)操作が実行された場合、Workspace Managerは共有ロックを取得し、次の条件が規定されます。

  • 子表の外部キーに影響する挿入または更新操作中は、親表での削除操作は実行できません。たとえば、DEPARTMENTが親表、EMPLOYEEが子表の場合、新規従業員の追加中、または既存の従業員の異なる部門への割当て中に部門の削除はできません。

  • 親表での削除操作中は、子表に対して外部キー列に影響する挿入または更新操作は実行できません。たとえば、部門の削除中、新規従業員の追加および既存の従業員の異なる部門へ割当てはできません。


関連項目:

共有ロックおよび排他ロックの説明など、Workspace Managerによるロックについては、第1.3項を参照してください。

次のどちらかのDML操作を複数のセッションで同時に実行できます。ただし、次の両方を同時には実行できません。

  • 子表の外部キー列に影響する挿入操作または更新操作。

  • 親表での削除操作。

次のWorkspace Manager操作のいずれかを、複数のセッションで同時に実行できます。

  • MergeTableプロシージャを使用して、異なる作業領域で子表または親表に変更を適用します。

  • MergeTableプロシージャを使用して、1つの作業領域で子表に変更を適用し、別の作業領域で子表に挿入または更新をします。

  • MergeTableプロシージャを使用して、1つの作業領域で親表に変更を適用し、別の作業領域で親表から削除します。

次の場合、セッションは他のセッションが終了するまでブロックされます。

  • セッションが1つの作業領域で子表への変更をマージしようとしており、別のセッションが別の作業領域で親表への変更をマージしようとしている場合。

  • セッションが1つの作業領域で子表への変更をマージしようとしており、別のセッションが親表から削除しようとしている場合。

  • セッションが1つの作業領域で親表への変更をマージしようとしており、別のセッションが子表へ挿入、または子表の外部キーの値を変更しようとしている場合。

1.9.2 一意制約

一意制約が定義されている表をバージョン対応にすることができます。サポート対象は次のとおりです。

  • 1列または複数列に対するUNIQUE制約

  • 1列または複数列の一意索引

  • 表のファンクションの一意索引

NULL値の取扱いは、バージョン対応表の場合もバージョン対応でない表の場合も同じです。

Workspace Managerは、次の静的データ・ディクショナリ・ビュー(第5章を参照)を使用して、一意制約のサポートに関連する情報を保持します。

1.9.3 SET NULL制約

SET NULL制約はWorkspace Managerでサポートされません。表がSET NULL制約を持つ場合、この制約は表がバージョン対応になったときRESTRICTオプションに変換されます。

たとえば、ON DELETE SET NULL制約はON DELETE RESTRICTへ変換されます。

1.10 バージョン対応表に対するトリガー

バージョン対応表には、トリガーを定義できます。ただし、その場合は、次の考慮点および制限事項が適用されます。

バージョン対応表でサポートされないすべてのトリガーは、バージョニングが使用可能になったときに解除され、バージョニングが使用禁止になったときにアクティブにされます。

SetTriggerEventsプロシージャを使用すると、イベントの種類を指定し、それに対して特定のユーザー定義トリガーを選択的に使用可能にすることができます。

1.11 Virtual Private Databaseの考慮事項

Workspace ManagerはOracle Virtual Private Database(VPD)テクノロジと併用できます。(Virtual Private Databaseの詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。)ただし、VPDでは、Workspace Managerに次の考慮事項が適用されます。

1.12 表のシノニムのサポート

Workspace Managerのプロシージャまたは表名をコールするファンクションの入力パラメータの場合、表名のかわりにシノニムを指定できます。Workspace Managerは、次の順序で表を検索し、指定された名前と最初に一致した表を使用します。

  1. 指定されたスキーマ(スキーマが指定されていない場合は、ローカル・スキーマ)内にある表

  2. 指定されたスキーマ(スキーマが指定されていない場合は、ローカル・スキーマ)内にあるプライベート・シノニム

  3. パブリック・シノニム

1.13 マテリアライズド・ビューのサポート

この項では、Workspace Managerとマテリアライズド・ビューを併用する場合の考慮事項について説明します。

バージョン対応表のマテリアライズド・ビューを作成できるのは、マテリアライズド・ビューの作成時に完全リフレッシュ方式(REFRESH COMPLETE)を指定する場合のみです。CREATE MATERIALIZED VIEW文には次の句を指定できません。

マテリアライズド・ビューまたはその実表はバージョン対応にできません。

マテリアライズド・ビューを作成する場合、その内容は作成時点のセッションの作業領域に基づきます。マテリアライズド・ビューをリフレッシュする場合、その内容はDBMS_MVIEW.REFRESH操作の実行時のセッションの作業領域に基づきます。マテリアライズド・ビューを作成またはリフレッシュすると、すべての作業領域に同じデータが表示されます。

1.14 空間トポロジのサポート

この項では、Oracle Spatialのトポロジによる表でWorkspace Managerを使用する場合の特別な考慮事項と手法について説明します。Oracle Spatialのトポロジの詳細は、『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照してください。

トポロジは、フィーチャー表と、<topology-name>_NODE$<topology-name>_EDGE$<topology-name>_FACE$<topology-name>_RELATION$および<topology-name>_HISTORY$形式の名前を持つ表で構成されています。トポロジ表をバージョン対応表にする場合は、そのトポロジに関連付けられている表をすべてバージョン対応にする必要があります。そのためには、EnableVersioningプロシージャのtable_nameパラメータにトポロジ名を指定し、isTopologyパラメータをTRUEに設定する必要があります。次に例を示します。

EXECUTE DBMS_WM.EnableVersioning(table_name => 'xyz_topo', isTopology => TRUE);

この例では、xyz_topoトポロジをバージョン対応にしています。つまり、xyz_topoトポロジに関連付けられているフィーチャー表すべてと、XYZ_TOPO_NODE$XYZ_TOPO_FACE$XYZ_TOPO_EDGE$XYZ_TOPO_RELATION$およびXYZ_TOPO_HISTORY$の各表がバージョン対応になります。

バージョン対応トポロジには、1つ以上のフィーチャー表が必要です。

トポロジ表のバージョニングを使用禁止にするには、DisableVersioningプロシージャのtable_nameパラメータにトポロジ名を指定し、isTopologyパラメータをTRUEに設定して、そのトポロジに関連付けられている表すべてのバージョニングを使用禁止にする必要があります。

ただし、トポロジ表をバージョン対応またはバージョン非対応にする操作に関する前述のガイドラインには、次の例外があります。

この2つの場合は、フィーチャー表を個別にバージョン対応またはバージョン非対応にする必要があります。つまり、最初にフィーチャー表(および参照整合性制約で要求される表)に対してEnableVersioningまたはDisableVersioningプロシージャをコールしてから、トポロジ名を指定してEnableVersioningまたはDisableVersioningプロシージャをコールします。

1.14.1 トポロジ使用時のロックに関する考慮事項

トポロジに関連付けられている行をロックまたはロック解除するには、LockRowsまたはUnlockRowsプロシージャのtable_nameパラメータにトポロジ名を指定し、XminYminXmaxおよびYmaxパラメータを使用して、その行を含むウィンドウを識別する必要があります。また、where_clauseパラメータは指定できません。次に例を示します。

EXECUTE DBMS_WM.LockRows (workspace => 'ws1', table_name => 'xyz_topo', Xmin => 0.1, Ymin => 0.1,  Xmax => 0.5, Ymax => 0.5 );

この例では、指定のウィンドウに含まれる指定のトポロジの行すべてにバージョン・ロックが適用されます。作業領域(LIVE作業領域を含む)内でトポロジの要素を編集する手順は、次のとおりです。

  1. LockRowsプロシージャをコールして、対象ウィンドウに含まれるトポロジの要素すべてにバージョン・ロックを適用します。

  2. 同じ対象ウィンドウに対して、Oracle Spatial Topology JavaクライアントのloadWindowメソッドをコールします。

1.14.2 トポロジ使用時のその他の考慮事項

Workspace Managerを空間トポロジで使用する場合は、次の考慮事項が追加適用されます。

  • トポロジに関連付けられている表をバージョン対応にする前に、そのトポロジに対して少なくとも1回はSDO_TOPO.INITIALIZE_METADATAプロシージャをコールする必要があります。(SDO_TOPO.INITIALIZE_METADATAプロシージャは、トポロジをバージョン対応にした後も必要に応じてコールできます。)

  • トポロジに関連付けられているバージョン対応表では、MergeTableRefreshTableまたはRollbackTableプロシージャを使用しないでください。トポロジに関連付けられている表のマージ、リフレッシュまたはロールバックには、かわりにMergeWorkspaceRefreshWorkspaceまたはRollbackWorkspaceプロシージャを使用してください。

1.15 予約語と予約文字

Workspace Managerは内部オブジェクトの作成に固有の命名規則を使用するため、ある種のオブジェクトの名前では、避ける必要のある語や文字があります。表1-6に、オブジェクトの種類と、それらの名前に適用される制限を示します。(名前の長さのガイドラインについては、第1.1.11項表1-2を参照してください。)

表1-6 Workspace Managerの予約語および予約文字

オブジェクト 名前に使用できない文字(列)

作業領域

BASELIVE、または次の文字のいずれかを含む文字列: /(スラッシュ)、*(アスタリスク)、,(カンマ)、$(ドル記号)、#(ポンド記号)

バージョン対応表

_Gで終わる文字列

バージョン対応表の列

VERSIONNEXTVERDELSTATUSLTLOCKCREATETIMERETIRETIME、またはWM$WM_で始まる文字列

さらに、表に有効期間サポート(第3章を参照)がある場合、列の名前にRIDは使用できません。

バージョン対応表の索引

_PKI$または_TI$で始まる文字列


1.16 DBMS_WMサブプログラムのカテゴリ

Workspace ManagerのApplication Program Interface(API)は、単一のPL/SQLパッケージDBMS_WMにあるPL/SQLサブプログラム(プロシージャおよびファンクション)で構成されています。各サブプログラムは、この項で説明するカテゴリに論理的にグループ化できます。


注意:

ほとんどのWorkspace Managerサブプログラムはプロシージャですが、ファンクションもいくつかあります(ファンクションは値を戻しますが、プロシージャは値を戻しません)。

ほとんどのファンクションの名前は、Get で始まります(GetConflictWorkspaceおよびCreateSavepointなど)。


すべてのサブプログラムのリファレンス情報については、第4章を参照してください。

1.16.1 表管理サブプログラム

表管理サブプログラムは、表に対する作業領域管理を使用可能および使用禁止にし、その他の表関連操作を実行します。

表1-7に、表の管理に使用できるサブプログラムを示します。

表1-7 表管理サブプログラム

プロシージャ 説明

EnableVersioning


表をバージョン対応にし、表が複数バージョンの行をサポートできるように、必要な構造を作成します。

DisableVersioning


バージョン対応表内に作成された行のサポート構造をすべて削除します。

SetWoOverwriteOFF


EnableVersioningプロシージャまたはSetWoOverwriteONプロシージャによって使用可能になったVIEW_WO_OVERWRITE履歴オプションを使用禁止にし、履歴オプションをVIEW_W_OVERWRITE(上書きを伴う)に変更します。

SetWoOverwriteON


SetWoOverwriteOFFプロシージャによって使用禁止になったVIEW_WO_OVERWRITE履歴オプションを使用可能にします。

BeginDDL


指定された表に対してDDLセッションを開始します。

CommitDDL


DDLセッション中に指定された表に対して行われたDDL変更をコミットし、DDLセッションを終了します。

RollbackDDL


DDLセッション中に指定された表に対して行われたDDL変更をロールバックし(取り消し)、DDLセッションを終了します。

RecoverAllMigratingTables


Workspace Managerの移行プロシージャが正常に実行されなかった場合、一貫性のない状態になっている表の移行プロセスを完了しようとします。

RecoverAllMigratingTables


Workspace Managerの移行プロシージャが正常に実行されなかった場合、一貫性のない状態になっているすべての表の移行プロセスを完了しようとします。

CopyForUpdate


バージョン対応表内のラージ・オブジェクト(LOB)列(BLOB、CLOBまたはNCLOB)を変更します。

Export


バージョン対応表からステージング表にデータ(すべての行、または複数のパラメータの組合せで限定された行)をエクスポートします。

Import


ステージング表から指定の作業領域内のバージョン対応表に、データ(すべての行、または複数のパラメータの組合せで限定された行)をインポートします。


1.16.2 作業領域管理サブプログラム

作業領域管理サブプログラムは、作業領域に対する操作を実行します。

表1-8に、作業領域の管理に使用できるサブプログラムを示します。

表1-8 作業領域管理サブプログラム

プロシージャ 説明

CreateWorkspace


データベース内に新しい作業領域を作成します。

GotoWorkspace


現行のセッションを指定された作業領域に移動します。

SetDiffVersions


2つのセーブポイントまたは2つの作業領域間のバージョン対応表における値の差異を検索します。差異を記述する行を様々なビューに作成します。

GetDiffVersions


SetDiffVersions操作が実行されたセッションの作業領域とセーブポイントのペアの名前を戻します。

MergeTable


作業領域内の表(すべての行、またはWHERE句で指定された行)に対する変更をその親作業領域に適用します。

MergeWorkspace


作業領域内のすべての変更をその親作業領域に適用します。また、オプションで、その作業領域を削除できます。

RollbackWorkspace


作業領域内のバージョン対応表に対するすべての変更を廃棄します。

RollbackTable


作業領域内の指定された表(すべての行、またはWHERE句で指定された行)に対するすべての変更を廃棄します。

RollbackToSP


指定されたセーブポイント以降に行われた作業領域内のバージョン対応表に対するすべての変更を廃棄します。

RefreshTable


作業領域に対し、その親作業領域内の表(すべての行、またはWHERE句に指定された行)に対するすべての変更を適用します。

RefreshWorkspace


作業領域に対し、その親作業領域内のすべての変更を適用します。

AlterWorkspace


作業領域の定義を変更します。

ChangeWorkspaceType


連続的にリフレッシュされない作業領域を連続的にリフレッシュされるように変更します。

RemoveWorkspace


作業領域に関連付けられたすべての行バージョンを廃棄し、作業領域を削除します。

RemoveWorkspaceTree


作業領域およびその子作業領域に関連付けられたすべての行バージョンを廃棄し、影響を受ける作業領域を削除します。

FreezeWorkspace


作業領域へのアクセスおよび作業領域内で変更を行うユーザーの権限を制限します。

UnfreezeWorkspace


作業領域にアクセスできるようにし、また作業領域に対する変更を有効にし、FreezeWorkspaceプロシージャによる処理を元に戻します。

CompressWorkspace


作業領域内の削除可能なセーブポイントを削除し、その作業領域のWorkspace Managerメタデータ構造を最小化します。

CompressWorkspaceTree


作業領域およびそのすべての子作業領域内の削除可能なセーブポイントを削除します。また、影響を受ける作業領域のWorkspace Managerメタデータ構造を最小化し、セーブポイントの削除によって不要となったデータを排除します。

IsWorkspaceOccupied


作業領域内にアクティブなセッションがあるかどうかを確認します。

CreateSavepoint


セッションの現行の作業領域を戻します。

SetMultiWorkspaces


指定された作業領域(1つまたは複数)をバージョン対応表の複数作業領域ビューで表示します。

GetMultiWorkspaces


バージョン対応表の複数作業領域ビューで参照できる作業領域の名前を戻します。

GetOpContext


現行のセッションに対する現行の操作のコンテキストを戻します。

AddAsParentWorkspace


複数の親を持つ作業領域環境で、作業領域を子作業領域に親作業領域として追加します。

RemoveAsParentWorkspace


複数の親を持つ作業領域環境で、作業領域を親作業領域として削除します。


1.16.3 セーブポイント管理サブプログラム

セーブポイント管理サブプログラムは、セーブポイントに関連する操作を実行します。

表1-9に、セーブポイントの管理に使用できるサブプログラムを示します。

表1-9 セーブポイント管理サブプログラム

プロシージャ 説明

CreateSavepoint


現行バージョンのセーブポイントを作成します。

GotoDate


現行の作業領域内の指定されたセーブポイントに移動します。

GotoDate


現行の作業領域内の指定された日付および時刻またはそれに近い時点のセーブポイントに移動します。

GetSessionInfo


現行の作業領域およびセッション・コンテキストに関する情報を取得します。セッションの現行のセーブポイントまたはある時点を検索する場合に有効です。

AlterSavepoint


セーブポイントの定義を変更します。

DeleteSavepoint


バージョン対応表内のセーブポイントおよび関連する行を削除します。


1.16.4 権限管理サブプログラム

権限管理サブプログラムは、Workspace Managerの権限の付与および取消しを行います。

表1-10に、権限の管理に使用できるサブプログラムを示します。

表1-10 権限管理サブプログラム

プロシージャ 説明

GrantWorkspacePriv


ユーザー、ロールまたはPUBLICに作業領域レベルの権限を付与します。

RevokeWorkspacePriv


ユーザーおよびロールから作業領域レベルの権限を取り消します。

GrantSystemPriv


ユーザー、ロールまたはPUBLICにすべての作業領域に対する権限を付与します。

RevokeSystemPriv


ユーザーおよびロールからシステム・レベルの権限を取り消します。

GetPrivs


指定された作業領域に対して現行のユーザーが取得しているすべての権限のリストを戻します。このリストでは、権限がカンマで区切られます。


1.16.5 ロック管理サブプログラム

ロック管理サブプログラムは、Workspace Managerのロック操作を制御します。

表1-11に、ロックの管理に使用できるサブプログラムを示します。

表1-11 ロック管理サブプログラム

プロシージャ 説明

SetLockingON


現行のセッションに対してWorkspace Managerのロック操作を使用可能にします。

SetLockingOFF


現行のセッションに対してWorkspace Managerのロック操作を使用禁止にします。

SetWorkspaceLockModeON


指定された作業領域に対してWorkspace Managerのロック操作を使用可能にします。

SetWorkspaceLockModeOFF


指定された作業領域に対してWorkspace Managerのロック操作を使用禁止にします。

GetLockMode


現行のセッションのロック・モードを戻します。これによって、バージョン対応行、および前回のバージョン内の対応する行にアクセスできるかどうかが決まります。

LockRows


指定された表内のバージョン対応行、および親作業領域内のそれに対応する行へのアクセスを制御します。

UnlockRows


指定された表内のバージョン対応行、および親作業領域内のそれに対応する行にアクセスできるようにします。


1.16.6 競合管理サブプログラム

競合管理サブプログラムは、作業領域間における競合を検出し、解消します。

表1-12に、競合の管理に使用できるサブプログラムを示します。

表1-12 競合管理サブプログラム

プロシージャ 説明

SetConflictWorkspace


作業領域とその親作業領域の間に競合があるかどうかを判断します。

GetConflictWorkspace


SetConflictWorkspaceプロシージャを実行したセッションの作業領域の名前を戻します。

BeginResolve


競合解消セッションを開始します。

ResolveConflicts


作業領域間における競合を解消します。

CommitResolve


競合解消セッションを終了し、BeginResolveプロシージャの実行以降に作業領域内で行われたすべての変更を保存します(永続的な変更にします)。

RollbackResolve


競合解消セッションを終了し、BeginResolveプロシージャの実行以降に作業領域内で行われたすべての変更を廃棄します。


1.16.7 レプリケーション・サポート・サブプログラム

レプリケーション・サポート・サブプログラムは、Workspace Manager環境におけるOracle Replicationをサポートします。レプリケーションの使用方法の詳細は、付録Cを参照してください。

表1-13に、レプリケーションのサポートに使用できるサブプログラムを示します。

表1-13 レプリケーション・サポート・サブプログラム

プロシージャ 説明

GenerateReplicationSupport


Workspace Managerオブジェクトのマルチマスター・レプリケーションに必要な構造体を作成し、新しく作成されたマスター・グループに対するマスター・アクティビティを開始します。

DropReplicationSupport


GenerateReplicationSupportプロシージャによって作成されたレプリケーション・サポート・オブジェクトを削除します。

RelocateWriterSite


Workspace Managerのレプリケーション環境のnonwriterサイトの1つを新しいwriterサイトにします。(以前のwriterサイトは、nonwriterサイトの1つになります。)

SynchronizeSite


RelocateWriterSiteプロシージャを使用して、writerサイトが移動した後、Workspace Managerのレプリケーション環境のローカル・サイト(以前のwriterサイト)を最新の状態に更新します。


1.16.8 バルク・ロード・サポート・サブプログラム

バルク・ロード・サポート・サブプログラムは、バージョン対応表へのデータのバルク・ロードにSQL*Loaderを使用できるようにします。詳細は、第1.7項を参照してください。

表1-14に、バルク・ロードのサポートに使用できるサブプログラムを示します。

表1-14 バルク・ロード・サポート・サブプログラム

プロシージャ 説明

GetBulkLoadVersion


BeginBulkLoadingプロシージャのコール時に指定するバージョン番号を戻します。

BeginBulkLoading


バージョン対応表のバルク・ロード処理を開始します。

CommitBulkLoading


バルク・ロードによる変更をコミットして、バージョン対応表のバルク・ロード処理を終了します。

RollbackBulkLoading


バルク・ロード操作中にバージョン対応表に対して行われた変更をロールバックします。


1.17 Workspace Managerを使用した簡単な例

この項では、Workspace Managerを使用していくつかの使用例を試行し、その1つを選択するための簡単な例を2つ示します。それぞれの例では、複数の作業領域と1つ以上のセーブポイントを使用します。一方の例(第1.17.2項)では、Oracleサンプル・スキーマ内のOE.WAREHOUSES表を使用します。

どちらの例でも、この章で説明した概念を示し、第4章に示すプロシージャを使用します。

1.17.1 例: マーケティング予算のオプション

例1-3では、ある清涼飲料(コーラ)メーカーが4つの製品を製造し、その製品ごとにマーケティング・マネージャを配置し、マーケティング予算を計上している例を示します。1つの製品(cola_b)が市場で非常に大幅な成長が見込まれるため、この企業は、異なるマネージャや予算額を想定したwhat-if 分析を行っています。

例1-3 マーケティング予算のオプション

-------------------------------------------------------------------
-- INITIAL SET-UP
-------------------------------------------------------------------
-- Create the user for schema objects.
CREATE USER wm_developer IDENTIFIED BY password;

-- Grant regular privileges.
GRANT connect, resource to wm_developer;
GRANT create table to wm_developer;

-- Grant WM-specific privileges (with grant_option = YES).
EXECUTE DBMS_WM.GrantSystemPriv ('ACCESS_ANY_WORKSPACE, MERGE_ANY_WORKSPACE,
 CREATE_ANY_WORKSPACE, REMOVE_ANY_WORKSPACE, ROLLBACK_ANY_WORKSPACE',
 'wm_developer', 'YES');

---------------------------------------------------------------------------
-- CREATE AND POPULATE DATA TABLE --
---------------------------------------------------------------------------
CONNECT wm_developer
-- Enter password when prompted.

-- Cleanup: remove B_focus_2 workspace if it exists from previous run.
EXECUTE DBMS_WM.RemoveWorkspace ('B_focus_2');

-- Create a table for the annual marketing budget for
-- several cola (soft drink) products.
-- Each row will contain budget data for a specific
-- product. Note: This table does not reflect recommended
-- database design. (For example, a manager ID should
-- be used, not a name.) It is deliberately oversimplified
-- for purposes of illustration.

CREATE TABLE cola_marketing_budget (
  product_id NUMBER PRIMARY KEY,
  product_name VARCHAR2(32),
  manager VARCHAR2(32),  -- Here a name, just for simplicity
  budget NUMBER  -- Budget in millions of dollars. Example: 3 = $3,000,000.
);

-- Version-enable the table. Specify hist option of VIEW_WO_OVERWRITE so that
-- the COLA_MARKETING_BUDGET_HIST view contains complete history information
-- about data changes.
EXECUTE DBMS_WM.EnableVersioning ('cola_marketing_budget', 'VIEW_WO_OVERWRITE');

INSERT INTO cola_marketing_budget VALUES(
  1,
  'cola_a',
  'Alvarez',
  2.0
);
INSERT INTO cola_marketing_budget VALUES(
  2,
  'cola_b',
  'Baker',
  1.5
);
INSERT INTO cola_marketing_budget VALUES(
  3,
  'cola_c',
  'Chen',
  1.5
);
INSERT INTO cola_marketing_budget VALUES(
  4,
  'cola_d',
  'Davis',
  3.5
);
COMMIT;

-- Relevant data values now in LIVE workspace:
-- 1, cola_a, Alvarez, 2.0
-- 2, cola_b, Baker, 1.5
-- 3, cola_c, Chen, 1.5
-- 4, cola_d, Davis, 3.5

---------------------------------------------------------------------------
-- CREATE WORKSPACES --
---------------------------------------------------------------------------
-- Create workspaces for the following scenario: a major marketing focus
-- for the cola_b product. Managers and budget amounts for each
-- product can change, but the total marketing budget cannot grow.
--
-- One scenario (B_focus_1) features a manager with more expensive
-- plans (which means more money taken from other products' budgets).
-- The other scenario (B_focus_2) features a manager with less expensive
-- plans (which means less money taken from other products' budgets).
--
-- Two workspaces (B_focus_1 and B_focus_2) are created as child workspaces
-- of the LIVE database workspace.

EXECUTE DBMS_WM.CreateWorkspace ('B_focus_1');
EXECUTE DBMS_WM.CreateWorkspace ('B_focus_2');

---------------------------------------------------------------------------
-- WORK IN FIRST WORKSPACE --
---------------------------------------------------------------------------
-- Enter the B_focus_1 workspace and change the cola_b manager to Beasley and
-- raise the cola_b budget amount by 1.5 to bring it to 3.0. Reduce all other
-- products' budget amounts by 0.5 to stay within the overall budget.

EXECUTE DBMS_WM.GotoWorkspace ('B_focus_1');
UPDATE cola_marketing_budget
  SET manager = 'Beasley' WHERE product_name = 'cola_b';
UPDATE cola_marketing_budget
  SET budget = 3 WHERE product_name = 'cola_b';
UPDATE cola_marketing_budget
  SET budget = 1.5 WHERE product_name = 'cola_a';
UPDATE cola_marketing_budget
  SET budget = 1 WHERE product_name = 'cola_c';
UPDATE cola_marketing_budget
  SET budget = 3 WHERE product_name = 'cola_d';
COMMIT;

-- Relevant data values now in B_focus_1 workspace::
-- 1, cola_a, Alvarez, 1.5
-- 2, cola_b, Beasley, 3.0
-- 3, cola_c, Chen, 1.0
-- 4, cola_d, Davis, 3.0

-- Freeze this workspace to prevent any changes until workspace is unfrozen.
-- However, first go to the LIVE workspace, because a workspace cannot be frozen
-- if any users (including you) are in it.
EXECUTE DBMS_WM.GotoWorkspace ('LIVE');
EXECUTE DBMS_WM.FreezeWorkspace ('B_focus_1');

---------------------------------------------------------------------------
-- CREATE ANOTHER SCENARIO IN SECOND WORKSPACE --
---------------------------------------------------------------------------
-- Enter the B_focus_2 workspace and change the cola_b manager to Burton and
-- raise the cola_b budget amount by 0.5 to bring it to 2.0. Reduce only the
-- cola_d amount by 0.5 to stay within the overall budget.

EXECUTE DBMS_WM.GotoWorkspace ('B_focus_2');
UPDATE cola_marketing_budget
  SET manager = 'Burton' WHERE product_name = 'cola_b';
UPDATE cola_marketing_budget
  SET budget = 2 WHERE product_name = 'cola_b';
UPDATE cola_marketing_budget
  SET budget = 3 WHERE product_name = 'cola_d';
COMMIT;

-- Relevant data values now in B_focus_2 workspace::
-- 1, cola_a, Alvarez, 2.0 (no change from LIVE)
-- 2, cola_b, Burton, 2.0
-- 3, cola_c, Chen, 1.5 (no change from LIVE)
-- 4, cola_d, Davis, 3.0 (same manager, new budget)

-- Create a savepoint (B_focus_2_SP1), then change scenario to
-- raise cola_b budget and reduce cola_d budget by 0.5 each.

EXECUTE DBMS_WM.CreateSavepoint ('B_focus_2', 'B_focus_2_SP1');
UPDATE cola_marketing_budget
  SET budget = 2.5 WHERE product_name = 'cola_b';
UPDATE cola_marketing_budget
  SET budget = 2.5 WHERE product_name = 'cola_d';
COMMIT;

-- Relevant data values now in B_focus_2 workspace:
-- 1, cola_a, Alvarez, 2.0 (no change from LIVE)
-- 2, cola_b, Burton, 2.5
-- 3, cola_c, Chen, 1.5 (no change from LIVE)
-- 4, cola_d, Davis, 2.5 (same manager, new budget)

-- Discard this scenario; roll back to row values at the time savepoint
-- B_focus_2_SP1 was created. First, though, get out of the workspace
-- so it can be rolled back (no users in it).

EXECUTE DBMS_WM.GotoWorkspace ('LIVE');
EXECUTE DBMS_WM.RollbackToSP ('B_focus_2', 'B_focus_2_SP1');

-- Go back to the B_focus_2 workspace and display current values
-- (should include budget of 2 for cola_b and 3 for cola_d).
EXECUTE DBMS_WM.GotoWorkspace ('B_focus_2');
SELECT * FROM cola_marketing_budget;

---------------------------------------------------------------------------
-- SELECT SCENARIO AND UPDATE DATABASE --
---------------------------------------------------------------------------
-- Assume that you have decided to adopt the scenario of the second
-- workspace (B_focus_2) using that workspace's current values.

-- First go to the LIVE workspace, because a workspace cannot be removed
-- or merged if any users (including you) are in it.
EXECUTE DBMS_WM.GotoWorkspace ('LIVE');

-- Unfreeze the first workspace and remove it to discard any changes there.
EXECUTE DBMS_WM.UnfreezeWorkspace ('B_focus_1');
EXECUTE DBMS_WM.RemoveWorkspace ('B_focus_1');

-- Apply changes in the second workspace to the LIVE database workspace.
-- Note that the workspace is not removed by default after MergeWorkspace.
EXECUTE DBMS_WM.MergeWorkspace ('B_focus_2');

-- Display the current data values (which are in the LIVE database
-- workspace, which is the only workspace currently existing).
SELECT * FROM cola_marketing_budget;

---------------------------------------------------------------------------
-- DISABLE VERSIONING --
---------------------------------------------------------------------------
-- Disable versioning on the table because you are finished testing scenarios.
-- Set force parameter to TRUE if you want to force the disabling even
-- if changes were made in a non-LIVE workspace.

EXECUTE DBMS_WM.DisableVersioning ('cola_marketing_budget', TRUE);

1.17.2 例: 倉庫拡張のオプション

例1-4では、Oracleサンプル・スキーマを使用している会社が、倉庫面積を拡張する必要があると決定している例を示します。この会社は2つの使用例を考慮しようとしています。一方はTown Aに1つの大規模倉庫を建設する案、他方はTown BとTown Cに2つの小規模倉庫を建設して全体の保管能力を拡大する案です。どちらの使用例にも潜在的なメリットとデメリットがあり、それぞれに財務上と法律上の課題があります。その後、この会社はそれぞれの使用例では倉庫面積が足りないと判断したため、両方の使用例に同じ倉庫を追加する案を検討しようとしています。

例1-4では、使用例ごとに作業領域を1つ作成し、各作業領域内にセーブポイントを作成してから、表に対して新規倉庫を追加しています。これは、会社が倉庫の追加使用を決定しない可能性があるためです。倉庫の行は、Oracleサンプル・スキーマの一部であるOE.WAREHOUSES表に格納されています。

例1-4 倉庫拡張のオプション

-------------------------------------------------------------------
-- INITIAL SET-UP
-------------------------------------------------------------------
-- Clean up from any previous running of this procedure.
DROP USER wm_developer CASCADE;

-- Create the user for schema objects.
CREATE USER wm_developer IDENTIFIED BY password;

-- Grant regular privileges.
GRANT connect, resource TO wm_developer;
GRANT create table TO wm_developer;

-- Grant privileges on tables to be modified.
GRANT select, insert, delete, update ON oe.warehouses TO wm_developer;
GRANT select, insert, delete, update ON hr.locations TO wm_developer;

-- Grant WM-specific privileges (with grant_option = YES).
EXECUTE DBMS_WM.GrantSystemPriv ('ACCESS_ANY_WORKSPACE, MERGE_ANY_WORKSPACE,
 CREATE_ANY_WORKSPACE, REMOVE_ANY_WORKSPACE, ROLLBACK_ANY_WORKSPACE',
 'wm_developer', 'YES');

-- WM_ADMIN_ROLE required to version-enable a table in another schema.
GRANT wm_admin_role TO wm_developer;

-- Create rows for new locations, since a valid location ID is needed for each
-- proposed new warehouse.
INSERT INTO hr.locations VALUES
   (4000, '123 Any Street', '01234', 'Town A', 'MA', 'US');
INSERT INTO hr.locations VALUES
   (4100, '456 Some Street', '01235', 'Town B', 'MA', 'US');
INSERT INTO hr.locations VALUES
   (4200, '789 Other Street', '01236', 'Town C', 'MA', 'US');
INSERT INTO hr.locations VALUES
   (4300, '1 Yetanother Street', '01237', 'Town D', 'MA', 'US');

---------------------------------------------------------------------------
-- CREATE AND VERSION-ENABLE THE DATA TABLE --
---------------------------------------------------------------------------
CONNECT wm_developer
-- Enter password when prompted.
set echo on
set serveroutput on

-- Version-enable the OE.WAREHOUSES table. Specify hist option of
-- VIEW_WO_OVERWRITE so that the WAREHOUSES_HIST view contains
-- complete history information about data changes. However, because
-- OE.WAREHOUSES is the parent table in a referential integrity constraint
-- with OE.INVENTORIES, you must also version-enable that table.

EXECUTE DBMS_WM.EnableVersioning ('OE.WAREHOUSES, OE.INVENTORIES', hist => 'VIEW_WO_OVERWRITE');

------------------------------------------------------------------------
-- CREATE AND USE WORKSPACES --
------------------------------------------------------------------------
-- The company has decided that it needs additional warehouse space.
-- It wants to consider two scenarios: a single large warehouse in Town A,
-- and two smaller warehouses in Town B and Town C that together offer more
-- total storage capacity. There are potential advantages and disadvantages
-- to each scenario, and financial and legal issues to be resolved with each.
--
-- Later, the company decides that it might need even more warehouse
-- space under each scenario, so it wants to consider the same additional
-- warehouse in each scenario.

-- Create a workspace for each scenario, with both created as child
-- workspaces of the LIVE database workspace.
-- In workspace large_warehouse, add one row for the single large warehouse.
-- In workspace smaller_warehouses, add two rows, one for each warehouse.
--
-- Also, within each workspace create a savepoint before adding the
-- extra warehouse, because the company might decide it does not
-- need the warehouse.

EXECUTE DBMS_WM.CreateWorkspace (workspace => 'large_warehouse');
EXECUTE DBMS_WM.CreateWorkspace (workspace => 'smaller_warehouses');

-- Set up the first scenario: Go to the large_warehouse workspace and first add
-- one row for a warehouse.

EXECUTE DBMS_WM.GotoWorkspace (workspace => 'large_warehouse');

INSERT INTO oe.warehouses VALUES (10, NULL, 'Town A', 4000,
        MDSYS.SDO_GEOMETRY(2001, 8307,
        MDSYS.SDO_POINT_TYPE(-71.00703, 42.27099, NULL), NULL, NULL));

UPDATE oe.warehouses SET warehouse_spec = sys.xmltype.createxml(
'<?xml version="1.0"?>
<Warehouse>
<Building>Owned</Building>
<Area>100000</Area>
<Docks>2</Docks>
<DockType>Side load</DockType>
<WaterAccess>Y</WaterAccess>
<RailAccess>Y</RailAccess>
<Parking>Lot</Parking>
<VClearance>15 ft</VClearance>
</Warehouse>'
) WHERE warehouse_id = 10;

COMMIT;

-- Create a savepoint so that you can, if necessary, roll back to the point
-- before the extra warehouse was added.
EXECUTE DBMS_WM.CreateSavepoint ('large_warehouse', 'large_warehouse_add_wh');

-- Add another warehouse for this scenario.
INSERT INTO oe.warehouses VALUES (11, NULL, 'Town D', 4300,
        MDSYS.SDO_GEOMETRY(2001, 8307,
        MDSYS.SDO_POINT_TYPE(-71.00707, 42.35226, NULL), NULL, NULL));

UPDATE oe.warehouses SET warehouse_spec = sys.xmltype.createxml(
'<?xml version="1.0"?>
<Warehouse>
<Building>Leased</Building>
<Area>55000</Area>
<Docks>1</Docks>
<DockType>Rear load</DockType>
<WaterAccess>N</WaterAccess>
<RailAccess>N</RailAccess>
<Parking>Street</Parking>
<VClearance>10 ft</VClearance>
</Warehouse>'
) WHERE warehouse_id = 11;

COMMIT;

-- Freeze this workspace to prevent any changes until the workspace is unfrozen.
-- However, first go to the LIVE workspace, because a workspace cannot be frozen
-- if any users (including you) are in it.
EXECUTE DBMS_WM.GotoWorkspace ('LIVE');
EXECUTE DBMS_WM.FreezeWorkspace ('large_warehouse');

-- Set up the second scenario: Go to the smaller_warehouses workspace and first
-- add two rows for the smaller warehouses.

EXECUTE DBMS_WM.GotoWorkspace ('smaller_warehouses');

INSERT INTO oe.warehouses VALUES (10, NULL, 'Town B', 4100,
        MDSYS.SDO_GEOMETRY(2001, 8307,
        MDSYS.SDO_POINT_TYPE(-71.02439, 42.28628, NULL), NULL, NULL));

INSERT INTO oe.warehouses VALUES (11, NULL, 'Town C', 4200,
        MDSYS.SDO_GEOMETRY(2001, 8307,
        MDSYS.SDO_POINT_TYPE(-70.97980, 42.37961, NULL), NULL, NULL));

UPDATE oe.warehouses SET warehouse_spec = sys.xmltype.createxml(
'<?xml version="1.0"?>
<Warehouse>
<Building>Owned</Building>
<Area>60000</Area>
<Docks>1</Docks>
<DockType>Side load</DockType>
<WaterAccess>Y</WaterAccess>
<RailAccess>Y</RailAccess>
<Parking>Lot</Parking>
<VClearance>15 ft</VClearance>
</Warehouse>'
) WHERE warehouse_id = 10;

UPDATE oe.warehouses SET warehouse_spec = sys.xmltype.createxml(
'<?xml version="1.0"?>
<Warehouse>
<Building>Leased</Building>
<Area>550000</Area>
<Docks>1</Docks>
<DockType>Rear load</DockType>
<WaterAccess>N</WaterAccess>
<RailAccess>Y</RailAccess>
<Parking>Street</Parking>
<VClearance>12 ft</VClearance>
</Warehouse>'
) WHERE warehouse_id = 11;

COMMIT;

-- Create a savepoint so that you can, if necessary, roll back to the point
-- before the extra warehouse was added.
EXECUTE DBMS_WM.CreateSavepoint ('smaller_warehouses', 'smaller_warehouses_add_wh');

-- Add the extra warehouse for this scenario.
INSERT INTO oe.warehouses VALUES (12, NULL, 'Town D', 4300,
        MDSYS.SDO_GEOMETRY(2001, 8307,
        MDSYS.SDO_POINT_TYPE(-71.00707, 42.35226, NULL), NULL, NULL));

UPDATE oe.warehouses SET warehouse_spec = sys.xmltype.createxml(
'<?xml version="1.0"?>
<Warehouse>
<Building>Leased</Building>
<Area>55000</Area>
<Docks>1</Docks>
<DockType>Rear load</DockType>
<WaterAccess>N</WaterAccess>
<RailAccess>N</RailAccess>
<Parking>Street</Parking>
<VClearance>10 ft</VClearance>
</Warehouse>'
) WHERE warehouse_id = 12;

COMMIT;

---------------------------------------------------------------------------
-- SELECT A SCENARIO, AND APPLY IT --
---------------------------------------------------------------------------
-- Later, the company makes its decisions:
-- 1. Add two smaller warehouses.
-- 2. Do not add the extra warehouse (that is, no third new warehouse).
-- Consequently, you need to discard the first scenario (large_warehouse
-- workspace) completely, discard the warehouse addition in the second
-- scenario (roll back to smaller_warehouses_add_wh savepoint), and
-- apply the second scenario.

-- First go to the LIVE workspace, because a workspace cannot be removed
-- or merged if any users (including you) are in it.
EXECUTE DBMS_WM.GotoWorkspace ('LIVE');

-- Unfreeze the first workspace and remove it to discard any changes there.
EXECUTE DBMS_WM.UnfreezeWorkspace ('large_warehouse');
EXECUTE DBMS_WM.RemoveWorkspace ('large_warehouse');

-- Rollback the workspace for the second scenario to the savepoint created
-- before the extra warehouse was added.
EXECUTE DBMS_WM.RollbackToSP ('smaller_warehouses', 'smaller_warehouses_add_wh');

-- Apply changes in the smaller_warehouses workspace to the LIVE database
-- workspace; use the remove_workspace parameter to remove the
-- smaller_warehouses workspace after the merge.
EXECUTE DBMS_WM.MergeWorkspace ('smaller_warehouses', remove_workspace => TRUE);

-- The OE.WAREHOUSES table now has the desired data (two additional warehouses
-- from the smaller_warehouses scenario). Display the IDs and names just to be
-- sure.
SELECT warehouse_id, warehouse_name FROM oe.warehouses
   ORDER BY warehouse_id;

-- Disable versioning on the table because you are finished testing scenarios.
-- Set the force parameter to TRUE to force disabling even though changes
-- were made in a non-LIVE workspace. You must also version-disable
-- the other tables previously version-enabled (along with OE.WAREHOUSES).

EXECUTE DBMS_WM.DisableVersioning ('OE.WAREHOUSES, OE.INVENTORIES', force => TRUE);

-- Clean up by deleting the rows that were added to the OE.WAREHOUSES table.
DELETE FROM oe.warehouses WHERE warehouse_id >= 10;

-- Clean up by deleting the locations that were added.
DELETE FROM hr.locations WHERE location_id >= 4000;

例1-4の終わり近くにあるSELECT文は、次の例に示すように、Town BとTown Cに新しく追加された倉庫を含め、OE.WAREHOUSES表にある倉庫のIDと名前を表示します。

SELECT warehouse_id, warehouse_name FROM oe.warehouses
   ORDER BY warehouse_id;

WAREHOUSE_ID WAREHOUSE_NAME
------------ -----------------------------------
           1 Southlake, Texas
           2 San Francisco
           3 New Jersey
           4 Seattle, Washington
           5 Toronto
           6 Sydney
           7 Mexico City
           8 Beijing
           9 Bombay
          10 Town B
          11 Town C