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

戻る
戻る
 
次へ
次へ
 

24 リソースのバージョン管理

この章では、Oracle XML DBリソースのバージョンを作成および管理する方法を説明します。

この章の内容は次のとおりです。

Oracle XML DBバージョニングの概要

Oracle XML DBバージョニングによって、Oracle XML DBのリソースの異なるバージョンを作成および管理する方法が提供されます。表や列などのリソースが更新されると、Oracle XML DBは、更新前のコンテンツを異なるリソース・バージョンとして格納します。

Oracle XML DBは、リソースをバージョン管理し、リソースの異なるバージョンを取り出すためのPL/SQLパッケージDBMS_XDB_VERSIONを提供しています。

Oracle XML DBバージョニングの機能

Versioningによって、Oracle XML DBリポジトリのリソースの変更を追跡できます。次の各項で、これらの機能について詳しく説明します。Oracle XML DBバージョニング機能には、次の機能が含まれます。

  • リソースのバージョン管理。Oracle XML DBリポジトリ・リソースのバージョン管理を有効または無効にするオプションがあります。「バージョン管理されたリソース(VCR)の作成」を参照してください。

  • バージョン管理されたリソースのプロセスの更新。Oracle XML DBは、バージョン管理されたリソース(VCR)を更新するときに、リソースの新しいバージョンを作成します。この新しいバージョンは、バージョン管理されたリソースを削除しても、データベースから削除されません。「バージョン管理されたリソース(VCR)の更新」を参照してください。

  • バージョン管理されたリソースのロード。Oracle XML DBではパス名を使用します。「バージョン管理されたリソース(VCR)の作成」を参照してください。

  • リソースのバージョンのロード。リソースのバージョンをロードするには、最初にそのバージョンのリソース・オブジェクトIDを検索し、そのIDを使用してバージョンをロードする必要があります。リソース・オブジェクトIDは、リソース・バージョンの履歴またはバージョン管理されたリソース自体から検索できます。「Oracle XML DBリソースのIDおよびパス名」を参照してください。


    注意:

    Oracle XML DBは、Oracle XML DBリソースのバージョン管理をサポートしています。Oracle Databaseに含まれるユーザー定義の表またはデータのバージョン管理はサポートされません。

    バージョンのリソース・オブジェクトIDは、チェックインからチェックアウト間での保持が保証されません。最後のバージョンのリソース・オブジェクトID以外はすべて保持されます。

    Oracle XML DBは、スキーマ表に関連付けられているトリガや制約がない場合にかぎり、XML Schemaに基づくリソースのバージョン管理をサポートします。


この章で使用されるOracle XML DBバージョニングの用語

表24-1に、この章で使用されるOracle XML DBバージョニングの用語を示します。

表24-1 Oracle XML DBバージョニングの用語

Oracle XML DBバージョニングの用語 説明

バージョン管理

Oracle XML DBリソースに対するすべての変更の記録または履歴が格納または管理される場合、そのリソースはバージョン管理されているといいます。

バージョン対応リソース

バージョン対応リソースは、バージョン管理可能なOracle XML DBリソースです。

バージョン管理されたリソース

バージョン管理されたリソースVCR)は、バージョン管理されたOracle XML DBリソースです。

バージョン・リソース

バージョン・リソースは、バージョン管理されたOracle XML DBリソースのバージョンです。バージョン・リソースは、読取り専用のOracle XML DBリソースです。これは、更新または削除できません。

チェックアウト・リソース

バージョン管理されたリソースがチェックアウトされた場合に作成されるOracle XML DBリソースです。

checkOutcheckInunCheckOut

Oracle XML DBリソースを更新するための操作です。バージョン管理されたリソースは、変更前にチェックアウトする必要があります。変更を永続的にする場合はCheckInを実行します。変更をキャンセルする場合はunCheckOutを実行します。


Oracle XML DBリソースのIDおよびパス名

リソースIDは、Oracle XML DBリソースに対する一意のシステム生成IDです。リソースIDは、パス名を持たないリソースの識別に有効です。たとえば、バージョン・リソースは、パス名を持たないシステム生成のリソースです。PL/SQL関数GetResourceByResIdを使用して、任意のリソース・オブジェクトIDのリソースを取り出すことができます。リソースがバージョン管理されている場合は、最初のバージョンIDが戻されます。

例24-1 DBMS_XDB_VERSION.GetResourceByResIdを使用したリソースの取得

DECLARE
  resid DBMS_XDB_VERSION.resid_type;
  res XMLType;
BEGIN
  resid := DBMS_XDB_VERSION.makeVersioned('/home/QUINE/versample.html');
  -- Obtain the resource
  res := DBMS_XDB_VERSION.getResoureceByResId(resid);
END;
/

バージョン管理されたリソース(VCR)の作成

Oracle XML DBは、更新の履歴を自動的には保持しません。これは、履歴を保持する必要のないOracle XML DBリソースが存在するためです。Oracle XML DBに要求を送信し、Oracle XML DBリソースをバージョン管理にする必要があります。今回のリリースでは、次のものを除いて、すべてのOracle XML DBリソースがバージョン対応リソースです。

バージョン管理されたリソースが作成されると、VCRの最初のバージョン・リソースが作成され、VCRは新しく作成されたバージョンへの参照になります。

「バージョン・リソースまたはVCRバージョン」を参照してください。

例24-2 DBMS_XDB_VERSION.makeVersionedを使用したVCRの作成

リソース'/home/QUINE/versample.html'は、バージョン管理されたリソースになります。

DECLARE
  resid DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
  resid := DBMS_XDB_VERSION.makeVersioned('/home/QUINE/versample.html');
END;
/

PL/SQLファンクションmakeVersionedは、バージョン管理されたリソースの最初のバージョンのリソースIDを戻します。このバージョンは、リソースIDによって表されます(「新しいバージョンのリソースID」を参照してください)。

ファンクションmakeVersionedでは、自動コミットは行われないため、COMMITを実行する必要があります。

バージョン・リソースまたはVCRバージョン

Oracle XML DBは、バージョン・リソースのパス名は提供しません。ただし、バージョン・リソースIDを提供します。バージョン・リソースは読取り専用のリソースです。

バージョン・リソースIDは、次の項で説明するパッケージDBMS_XDB_VERSIONのいくつかのメソッドによって戻されます。

新しいバージョンのリソースID

VCRが最初にチェックアウトされて更新されるときに、既存のリソースのコピーが作成されます。リソースの最新バージョンのリソースIDが変更されることはありません。したがって、常に元のリソースIDを使用して最新バージョンにアクセスできます。古いバージョンのリソースIDを取得するには、現在のリソースの先行リソースを取得します。

例24-3 チェックイン後の新しいバージョンのリソースIDの取出し

次の例で、/home/index.htmlのチェックイン後、新しいバージョンのリソースIDを取得する方法を示します。

-- Declare a variable for resource id
DECLARE
  resid DBMS_XDB_VERSION.RESID_TYPE;
  res XMLType;
BEGIN
  -- Get the id as user checks in.
  resid := DBMS_XDB_VERSION.checkIn('/home/QUINE/versample.html');
  -- Obtain the resource
  res := DBMS_XDB_VERSION.GetResourceByResId(resid);
END;
/

例24-4 Oracle XML DB: バージョン管理されたリソース(VCR)の作成と更新

DECLARE
  resid1 DBMS_XDB_VERSION.RESID_TYPE;
  resid2 DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
  -- Put a resource under version control.
  resid1 := DBMS_XDB_VERSION.makeVersioned('/home/QUINE/versample.html');

  -- Check out VCR to update its contents
  DBMS_XDB_VERSION.checkOut('/home/QUINE/versample.html');

  -- Use RESOURCE_VIEW to update versample.html
  UPDATE RESOURCE_VIEW
    SET RES =
          SYS.XMLTYPE.createXML(
            '<Resource
                 xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.oracle.com/xdb/XDBResource.xsd
                                     http://xmlns.oracle.com/xdb/XDBResource.xsd">
               <Author>Jane Doe</Author>
               <DisplayName>versample</DisplayName>
               <Comment>Has this got updated or not ?? </Comment>
               <Language>en</Language>
               <CharacterSet>ASCII</CharacterSet>
               <ContentType>text/plain</ContentType>
             </Resource>')
      WHERE equals_path(RES, '/home/QUINE/versample.html') = 1';

  -- Check in the change
  resid2 := DBMS_XDB_VERSION.checkIn('/home/QUINE/versample.html');

  -- The latest version can be obtained by resid2 and its predecessor
  -- can be obtained by using getPredecessor() or getPredsbyResId() functions.
  -- resid1 is no longer valid.
END;
/
-- Delete the VCR
DELETE FROM RESOURCE_VIEW
  WHERE equals_path(RES, '/home/QUINE/versample.html') = 1';

-- Once the preceding delete is done, any reference to the resource
-- (that is, check-in, check-out, and so on, results in
-- ORA-31001: Invalid resource handle or path name "/home/QUINE/versample.html"

バージョン管理されたリソース(VCR)へのアクセス

VCRも、通常のリソースと同様にパス名を持ちます。VCRへのアクセスは、Oracle XML DBの他のリソースへのアクセスと同じです。

バージョン管理されたリソース(VCR)の更新

VCRの更新は、バージョン管理されていないリソースの更新より多くの手順が必要です。VCRのコンテンツおよびメタデータ・プロパティを更新する前に、リソースをチェックアウトします。更新を永続的にするには、リソースにチェックインする必要があります。SQLトランザクションを明示的にコミットする必要があります。

VCRを更新するには、次の手順を実行します。

  1. VCRをチェックアウトし、VCRのパス名をOracle XML DBに渡します。

  2. VCRを更新します。VCRのコンテンツまたはメタデータ・プロパティのいずれかを更新できます。VCRの新しいバージョンは、チェックインされるまで作成されません。そのため、更新または削除操作は、チェックインまで持続的な効果を持ちません。(更新は、SQLのRESOURCE_VIEWPATH_VIEW、またはWebDAVなどの任意のプロトコルを使用して実行できます。)

  3. VCRをチェックインまたはそのチェックアウトをキャンセルします。リソースがチェックアウトされていない場合、前のバージョンが現在のバージョンにコピーされます。その後、前のバージョンは削除されます。

DBMS_XDB_VERSION.checkOutプロシージャ

Oracle9iリリース2(9.2)以上では、DBMS_XDB_VERSION.checkOutをコールすることによって、VCRのチェックアウト操作が実行されます。リソースの更新をコミットする必要がある場合は、チェックアウト後にコミットすることをお薦めします。チェックアウト直後にコミットしない場合、後でトランザクションをロールバックする必要が起きたときに、更新内容が失われます。

例24-5 VCRのチェックアウト

次に例を示します。

BEGIN
  -- Resource '/home/QUINE/versample.html' is checked out.
  DBMS_XDB_VERSION.checkout('/home/QUINE/versample.html');
END;
/

DBMS_XDB_VERSION.checkInプロシージャ

Oracle9iリリース2(9.2)以上では、DBMS_XDB_VERSION.CheckInをコールすることによって、VCRのチェックイン操作が実行されます。プロシージャCheckInでは、リソースのパス名を取ります。このパス名は、チェックアウトに渡したパス名と同じである必要はありませんが、チェックインのパス名とチェックアウトのパス名は、同じリソースのものである必要があります。

例24-6 VCRのチェックイン

次に例を示します。

-- Resource '/home/QUINE/versample.html' is checked in.
DECLARE
  resid DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
  resid := DBMS_XDB_VERSION.checkIn('/home/QUINE/versample.html');
END;
/

DBMS_XDB_VERSION.unCheckOutプロシージャ

Oracle9iリリース2(9.2)以上では、DBMS_XDB_VERSION.unCheckOutをコールすることによって、チェックアウトがキャンセルされます。このパス名は、チェックアウトに渡したパス名と同じである必要はありませんが、チェックインのパス名とチェックアウトのパス名は、同じリソースのものである必要があります。

例24-7 VCRのunCheckOut

次に例を示します。

-- Resource '/home/QUINE/versample.html' is unchecked out.
DECLARE
 resid DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
  resid := DBMS_XDB_VERSION.unCheckOut('/home/QUINE/versample.html');
END;
/

コンテンツおよびプロパティの更新

VCRのチェックアウト後、通常のリソースのコンテンツおよびプロパティを更新するためのOracle XML DBのすべての方法を、VCRに適用できます。たとえば、RESOURCE_VIEWPATH_VIEW、またはWebDAVを使用できます。


関連項目:

Oracle XML DBリソースの更新は、第25章「RESOURCE_VIEWおよびPATH_VIEWを使用したSQLアクセス」を参照してください。

VCRのアクセス制御およびセキュリティ

VCRまたはバージョン・リソースのアクセス制御は、バージョン管理されていないリソースと同様に行われます。これらのリソースへのアクセスを要求すると、アクセス制御リスト(ACL)が確認されます。

バージョン・リソース

makeversionを使用して、通常のリソースをVCRに変換すると、最初のバージョン・リソースが作成されます。この最初のバージョン・リソースのACLは、元のリソースのACLと同じです。チェックアウトされたリソースにチェックインすると、新しいバージョンが作成されます。この新しいバージョンのACLは、チェックアウトされたリソースのACLと同じです。バージョン・リソースを作成した後では、そのACLは変更できません。

最初のバージョンと同じVCRのACL

makeversionedを実行してVCRを作成すると、VCRのACLは、リソースの最初のバージョンのACLと同じになります。リソースにチェックインすると、新しいバージョンが作成され、VCRは、この新しいバージョンと同じコンテンツおよびプロパティ(ACLプロパティを含みます)を持ちます。

表24-2に、DBMS_XDB_VERSIONのサブプログラムを示します。

表24-2 DBMS_XDB_VERSIONのファンクションおよびプロシージャ

ファンクションおよびプロシージャ 説明

FUNCTION makeVersioned

makeVersioned(pathname VARCHAR2) RETURN DBMS_XDB_VERSION.RESID_TYPE;

パス名が指定された通常のリソースをバージョン管理されたリソースに変換します。複数のパス名が同じリソースにバインドされている場合、そのリソースのコピーが作成され、指定されたpath nameが新しく作成されたコピーにバインドされます。この新しいリソースは、バージョン管理されます。他のすべてのパス名は、引続き元のリソースを参照します。

pathname - バージョン管理するリソースのパス名。

return - VCRの最初のバージョン(ルート)のリソースID。これは、自動コミットのSQL操作ではありません。VCRにmakeVersionedをコールすることは正当な操作で、例外または警告のいずれも発生しません。フォルダ、バージョン・リソース、またはACLにmakeVersionedを実行することは許可されません。リソースが存在しない場合、例外が発生します。

PROCEDURE checkOut

checkOut(pathname VARCHAR2);

更新または削除前にVCRをチェックアウトします。

pathname - チェックアウトするVCRのパス名。これは、自動コミットのSQL操作ではありません。2人のユーザーが同時に同じVCRをチェックアウトすることはできません。これを行った場合、1人のユーザーがロールバックする必要があります。そのため、リソースの更新前に、チェックアウト操作をコミットすることをお薦めします。これによって、トランザクションをロールバックする場合に更新内容が失われなくなります。次の場合に例外が発生します。

  • 指定されたリソースがVCRでない場合

  • VCRがすでにチェックアウトされている場合

  • リソースが存在しない場合

FUNCTION checkIn

checkIn (pathname VARCHAR2) RETURN DBMS_XDB_VERSION.RESID_TYPE;

チェックアウトしVCRをチェックインします。

pathname - チェックアウトしたリソースのパス名。

return - 新しく作成されたバージョンのリソースID。

これは、自動コミットのSQL操作ではありません。プロシージャcheckInでは、チェックアウト操作に渡したパス名と同じパス名を指定する必要はありません。ただし、チェックインのパス名とチェックアウトのパス名は、操作を適切に実行するために、同じリソースのものである必要があります。

リソースの名前が変更された場合、古い名前が無効であるか、または異なるリソースにバインドされているため、新しい名前を使用してチェックインする必要があります。パス名が存在しない場合、例外が発生します。パス名が変更された場合は、新しいパス名を使用してリソースをチェックインする必要があります。

FUNCTION unCheckOut

unCheckOut(pathname VARCHAR2) RETURN DBMS_XDB.RESID_TYPE;

チェックアウトしリソースをチェックインします。

pathname - チェックアウトしたリソースのパス名。

return - リソースがチェックアウトされる前のバージョンのリソースID。これは、自動コミットのSQL操作ではありません。プロシージャunCheckOutでは、チェックアウト操作に渡したパス名と同じパス名を指定する必要はありません。ただし、unCheckOutのパス名とチェックアウトのパス名は、操作を適切に実行するために、同じリソースのものである必要があります。リソースの名前が変更された場合、古い名前が無効であるか、または異なるリソースにバインドされているため、新しい名前を使用してunCheckOutを実行する必要があります。パス名が存在しない場合、例外が発生します。パス名が変更された場合は、新しいパス名を使用してリソースをチェックインする必要があります。

FUNCTION GetPredecessors

GetPredecessors(pathname VARCHAR2) RETURN RESID_LIST_TYPE;

GetPredsByResId(resid DBMS_XDB.RESID_TYPE) RETURN RESID_LIST_TYPE;

指定されたバージョン・リソースまたはVCRで、pathname(リソースのパス名)によって先行のリソースを取得します。

return - 後続リソースのリスト。

residによる先行リソースの取得は、pathnameによる取得より効率的です。residまたはpathname が許可されない場合、例外が発生します。

指定されたバージョン・リソースまたはVCRで、resid(リソースID)によって先行リソースを取得します。

注意: Oracleの今回のリリースではブランチがサポートされていないため、先行リソースのリストは1つの要素(直接の親)のみを含みます。次のGetSuccessorsファンクションも、1つの要素のみを戻します。

FUNCTION GetSuccessors

GetSuccessors(pathname VARCHAR2) RETURN RESID_LIST_TYPE;

GetSuccsByResId(resid DBMS_XDB.RESID_TYPE) RETURN RESID_LIST_TYPE;

指定されたバージョン・リソースまたはVCRで、pathname(リソースのパス名)によって後続のリソースを取得します。

return - 後続リソースのリスト。リソースIDによる後続リソースの取得は、パス名による取得より効率的です。residまたはpathname が許可されない場合、例外が発生します。

指定されたバージョン・リソースまたはVCRで、resid(リソースID)によって後続のリソースを取得します。

FUNCTION GetResourceByResId

GetResourceByResId(resid DBMS_XDB.RESID_TYPE) RETURN XMLType;

指定されたリソース・オブジェクトIDで、リソースをXMLTypeとして取得します。

resid - リソース・オブジェクトID。

return - XMLTypeとしてのリソース。


Oracle XML DBバージョニング使用時のガイドライン

この項では、Oracle XML DBバージョニングを使用する場合のガイドラインについて説明します。