26 Oracle XML DBリポジトリへのPL/SQLアクセス

PL/SQLパッケージDBMS_XDB_CONFIGおよびDBMS_XDB_REPOSは、ともに、Oracle XML DBリソースのPL/SQL用アプリケーション・プログラム・インタフェース(API)を提供します。前者を使用して、Oracle XML DBとそのリポジトリを構成します。後者を使用して、リポジトリでのその他の非構成操作を実行します。

26.1 DBMS_XDB_REPOS: リポジトリ・リソースのアクセスと管理

PL/SQLパッケージDBMS_XDB_REPOSを使用すると、Oracle XML DBリポジトリ内のリソースにアクセスして管理できます。また、アクセス制御リスト(ACL)に基づいたリソースのセキュリティ管理も可能です。ACLは、どのリソースへのアクセス権をどのプリンシパル(ユーザーまたはロール)が持つかを決定するアクセス制御エントリ(ACE)のリストです。

表26-1に、パッケージDBMS_XDB_REPOSのファンクションおよびプロシージャの概要を示します。

表26-1 DBMS_XDB_REPOSのリソース・アクセスおよび管理サブプログラム

関数/プロシージャ 説明

addResource

指定された文字列を内容として持つ新規ファイル・リソースを階層に挿入します。

appendResourceMetadata

ユーザー定義のメタデータをリソースに追加します。

createFolder

新しいフォルダ・リソースを作成します。

createOIDPath

オブジェクト識別子(OID)に基づいてリソースへの仮想パスを作成します。

createResource

新しいファイル・リソースを作成します。

deleteResource

リポジトリからリソースを削除します。

deleteResourceMetadata

指定したユーザー定義のメタデータをリソースから削除します。

existsResource

絶対パスを指定されたリソースが存在するかどうかを示します。

getContentBLOB

リソースのコンテンツをBLOBインスタンスとして戻します。

getContentVARCHAR2

リソースのコンテンツをVARCHAR2値として戻します。

getContentXMLRef

リソースのコンテンツをXMLTypeインスタンスへの参照として戻します。

getContentXMLType

リソースのコンテンツをXMLTypeインスタンスとして戻します。

getLockToken

指定されたリソースのパスを使用して、現行のユーザーに対するリソースのロック・トークンを戻します。

getResOID

絶対パスで指定したリソースのオブジェクト識別子(OID)を戻します。

getResource

リポジトリ内の指定された場所で見つかったクラスDBMS_XDBRESOURCE.XDBResourceのインスタンスを戻します。

getXDB_tablespace

データベース・スキーマ(ユーザー・アカウント)XDBの現行の表領域を戻します。

hasBLOBContent

指定されたリソースにBLOBコンテンツがある場合はTRUEを戻します。

hasCharContent

指定されたリソースに文字コンテンツがある場合はTRUEを戻します。

hasXMLContent

指定されたリソースにXMLTypeコンテンツがある場合はTRUEを戻します。

hasXMLReference

指定されたリソースにXMLTypeコンテンツへの参照がある場合はTRUEを戻します。

isFolder

指定されたリソースがフォルダの場合はTRUEを戻します。

link

既存のリソースへのリンクを作成します。

lockResource

指定されたリソースのパスを使用して、WebDAV形式のロックを取得します。

processLinks

文書またはフォルダ内のすべてのXLink (非推奨)およびXIncludeリンクを処理します。

purgeResourceMetadata

すべてのユーザー定義のメタデータを指定されたリソースから削除します。

refreshContentSize

指定されたリソースのコンテンツ・サイズを再計算します。

renameResource

指定されたリソースの名前を変更します。

touchResource

最終更新時刻を現在の時刻に変更します。

unlockResource

ロック・トークンとパスで指定したリソースのロックを解除します。

updateResourceMetadata

ユーザー定義のリソース・メタデータを変更します。

例26-1では、パッケージDBMS_XDB_REPOSを使用してリポジトリ・リソースを管理します。次のものが作成されます。

  • フォルダ/publicの下のフォルダmydocs

  • 2つのファイル・リソースemp_selby.xmlおよびemp_david.xml

  • ファイル・リソースperson_selby.xmlおよびperson_david.xmlへの2つのリンク

続いて、新しく作成されたリソースとリンクが削除されます。フォルダを削除する前にフォルダの内容が削除されます。

関連項目:

appendResourceMetadataおよびdeleteResourceMetadataを使用した例は、ユーザー定義のリポジトリ・メタデータを参照してください。

例26-1 DBMS_XDB_REPOSを使用したリソースの管理

DECLARE
  retb BOOLEAN;
BEGIN
  retb := DBMS_XDB_REPOS.createfolder('/public/mydocs');
  retb := DBMS_XDB_REPOS.createresource('/public/mydocs/emp_selby.xml',
                                        '<emp_name>selby</emp_name>');
  retb := DBMS_XDB_REPOS.createresource('/public/mydocs/emp_david.xml',
                                        '<emp_name>david</emp_name>');
END;
/
PL/SQL procedure successfully completed.
 
CALL DBMS_XDB_REPOS.link('/public/mydocs/emp_selby.xml',
                         '/public/mydocs',
                         'person_selby.xml');
Call completed.
 
CALL DBMS_XDB_REPOS.link('/public/mydocs/emp_david.xml',
                         '/public/mydocs',
                         'person_david.xml');
Call completed.
 
CALL DBMS_XDB_REPOS.deleteresource('/public/mydocs/emp_selby.xml');
Call completed.
 
CALL DBMS_XDB_REPOS.deleteresource('/public/mydocs/person_selby.xml');
Call completed.
 
CALL DBMS_XDB_REPOS.deleteresource('/public/mydocs/emp_david.xml');
Call completed.
 
CALL DBMS_XDB_REPOS.deleteresource('/public/mydocs/person_david.xml');
Call completed.
 
CALL DBMS_XDB_REPOS.deleteresource('/public/mydocs');
Call completed.

26.2 DBMS_XDB_REPOS: ACLベースのセキュリティ管理

PL/SQLパッケージDBMS_XDB_REPOSには、Oracle XML DBのACLベースのセキュリティ管理ファンクションおよびプロシージャが用意されています。

表26-2 DBMS_XDB_REPOS: セキュリティ管理サブプログラム

関数/プロシージャ 説明

ACLCheckPrivileges

現行のユーザーに付与されたすべてのアクセス権限をACLで確認します。

changeOwner

指定されたリソースの所有者を指定ユーザーに変更します。

changePrivileges

リソースACLにACEを追加します。

checkPrivileges

現行のユーザーに付与された、あるリソースへのアクセス権限を確認します。

getACLDocument

リソースのパス名で指定された、リソースを保護しているACL文書を戻します。

getPrivileges

現行のユーザーに付与された、あるリソースへのすべての権限を戻します。

setACL

リソースのACLを設定します。

例26-2では、データベース・ユーザーHRが、フォルダ/public/mydocsと、それに含まれるファイルemp_selby.xmlの、2つのリソースを作成します。プロシージャgetACLDocumentがファイル・リソースでコールされて、文書の<principal>ユーザーがPUBLICであることを示しています。

例26-3では、システム管理者がプロシージャsetACLに接続して、所有者(データベース・スキーマHR)に、例26-2で作成されたファイル・リソースにおけるすべての権限を付与しています。プロシージャgetACLDocumentは、続いて<principal>ユーザーが所有者(HR)であるdav:ownerであることを示しています。

例26-4では、ユーザーHRがファンクションchangePrivilegesに接続して、新しいアクセス制御エントリ(ACE)をACLに追加して、リソースemp_selby.xmlにおけるすべての権限をユーザーoeに付与しています。プロシージャgetACLDocumentは、新しいACEがACLに追加されたことを示します。

例26-5では、ユーザーoeは接続してDBMS_XDB_REPOS.getPrivilegesをコールし、リソースemp_selby.xmlでユーザーoeに付与されたすべての権限を表示します。

例26-2 DBMS_XDB_REPOS.GETACLDOCUMENTの使用

CONNECT hr
Enter password: password

Connected.

DECLARE
  retb BOOLEAN;
BEGIN
  retb := DBMS_XDB_REPOS.createFolder('/public/mydocs');
  retb := DBMS_XDB_REPOS.createResource('/public/mydocs/emp_selby.xml',
                                        '<emp_name>selby</emp_name>');
END;
/
PL/SQL procedure successfully completed.
 
SELECT XMLSerialize(DOCUMENT
                    DBMS_XDB_REPOS.getACLDocument('/public/mydocs/emp_selby.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB_REPOS.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML
--------------------------------------------------------------------------------
<acl description="Public:All privileges to PUBLIC" xmlns="http://xmlns.oracle.co
m/xdb/acl.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaL
ocation="http://xmlns.oracle.com/xdb/acl.xsd                           http://xm
lns.oracle.com/xdb/acl.xsd" shared="true">
  <ace>
    <grant>true</grant>
    <principal>PUBLIC</principal>
    <privilege>
      <all/>
    </privilege>
  </ace>
</acl>
 
1 row selected.

例26-3 DBMS_XDB_REPOS.SETACLの使用

CONNECT SYSTEM
Enter password: password

Connected.
 
-- Give all privileges to owner, HR.
CALL DBMS_XDB_REPOS.setACL('/public/mydocs/emp_selby.xml',
                           '/sys/acls/all_owner_acl.xml');
Call completed.
COMMIT;
Commit complete.

SELECT XMLSerialize(DOCUMENT
                    DBMS_XDB_REPOS.getACLDocument('/public/mydocs/emp_selby.xml')
                    AS CLOB)
  FROM DUAL;

XMLSERIALIZE(DOCUMENTDBMS_XDB_REPOS.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML
--------------------------------------------------------------------------------
<acl description="Private:All privileges to OWNER only and not accessible to oth
ers" xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="DAV:" xmlns:xsi="htt
p://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.
com/xdb/acl.xsd http://xmlns.oracle.com/xdb/acl.xsd" shared="true">
  <ace>
    <grant>true</grant>
    <principal>dav:owner</principal>
    <privilege>
      <all/>
    </privilege>
  </ace>
</acl>
 
1 row selected.

例26-4 DBMS_XDB_REPOS.CHANGEPRIVILEGESの使用

CONNECT hr
Enter password: password

Connected.

SET SERVEROUTPUT ON

-- Add an ACE giving privileges to user OE
DECLARE
  r        PLS_INTEGER;
  ace      XMLType;
  ace_data VARCHAR2(2000);
BEGIN
  ace_data := '<ace xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
                                        http://xmlns.oracle.com/xdb/acl.xsd
                                        DAV:http://xmlns.oracle.com/xdb/dav.xsd">
                 <principal>OE</principal>
                 <grant>true</grant>
                 <privilege><all/></privilege>
               </ace>';
  ace := XMLType.createXML(ace_data);
  r := DBMS_XDB_REPOS.changePrivileges('/public/mydocs/emp_selby.xml', ace);
END;
/
 
PL/SQL procedure successfully completed.

COMMIT;

SELECT XMLSerialize(DOCUMENT
                    DBMS_XDB_REPOS.getACLDocument('/public/mydocs/emp_selby.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB_REPOS.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML
--------------------------------------------------------------------------------
<acl description="Private:All privileges to OWNER only and not accessible to oth
ers" xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="DAV:" xmlns:xsi="htt
p://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.
com/xdb/acl.xsd                           http://xmlns.oracle.com/xdb/acl.xsd" s
hared="false">
  <ace>
    <grant>true</grant>
    <principal>dav:owner</principal>
    <privilege>
      <all/>
    </privilege>
  </ace>
  <ace>
    <grant>true</grant>
    <principal>OE</principal>
    <privilege>
      <all/>
    </privilege>
  </ace>
</acl>
 
1 row selected.

例26-5 DBMS_XDB_REPOS.GETPRIVILEGESの使用

CONNECT oe
Enter password: password

Connected.

SELECT XMLSerialize(DOCUMENT
                    DBMS_XDB_REPOS.getPrivileges('/public/mydocs/emp_selby.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB_REPOS.GETPRIVILEGES('/PUBLIC/MYDOCS/EMP_SELBY.XML'
--------------------------------------------------------------------------------
<privilege xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:xsi="http://www.w3.
org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl
.xsd http://xmlns.oracle.com/xdb/acl.xsd DAV: http://xmlns.oracle.com/xdb/dav.xs
d" xmlns:xdbacl="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="DAV:">
  <read-properties/>
  <read-contents/>
  <write-config/>
  <link/>
  <unlink/>
  <read-acl/>
  <write-acl-ref/>
  <update-acl/>
  <resolve/>
  <link-to/>
  <unlink-from/>
  <dav:lock/>
  <dav:unlock/>
  <dav:write-properties/>
  <dav:write-content/>
  <dav:execute/>
  <dav:take-ownership/>
  <dav:read-current-user-privilege-set/>
</privilege>
 
1 row selected.

26.3 DBMS_XDB_CONFIG: 構成管理

PL/SQLパッケージDBMS_XDB_CONFIGには、Oracle XML DBの構成管理用ファンクションおよびプロシージャが用意されています。

注意:

FTPポート番号またはHTTPポート番号を設定または変更する場合は、PL/SQLパッケージDBMS_XDB_CONFIGのサブプログラムを使用することをお薦めします。構成ファイルxdbconfig.xmlを直接編集してポートを設定しないでください

表26-3 DBMS_XDB_CONFIG: 構成管理サブプログラム

サブプログラム 説明

addHTTPExpireMapping

有効期限に対するURLパターンのマッピングを表XDB$CONFIGに追加します。マッピングでは、パターンと一致するURLのExpireヘッダーを制御します。

addMIMEMapping

MIMEマッピングを表XDB$CONFIGに追加します。

addSchemaLocMapping

スキーマの場所のマッピングを表XDB$CONFIGに追加します。

addServlet

サーブレットを表XDB$CONFIGに追加します。

addServletMapping

サーブレット・マッピングを表XDB$CONFIGに追加します。

addServletSecRole

セキュリティ・ロール参照をサーブレットに追加します。

addXMLExtension

XML拡張機能を表XDB$CONFIGに追加します。

cfg_get

現行セッションの構成情報を戻します。

cfg_refresh

現行のOracle XML DB構成ファイルxdbconfig.xmlを使用してセッションの構成情報をリフレッシュします。

cfg_update

Oracle XML DB構成情報を更新します。構成ファイルxdbconfig.xmlが書き込まれます。

deleteHTTPExpireMapping

有効期限に対する指定されたURLパターンのすべてのマッピングを表XDB$CONFIGから削除します。

deleteMIMEMapping

MIMEマッピングを表XDB$CONFIGから削除します。

deleteSchemaLocMapping

スキーマの場所のマッピングを表XDB$CONFIGから削除します。

deleteServlet

サーブレットを表XDB$CONFIGから削除します。

deleteServletMapping

サーブレット・マッピングを表XDB$CONFIGから削除します。

deleteServletSecRole

セキュリティ・ロール参照をサーブレットから削除します。

deleteXMLExtension

XML拡張機能を表XDB$CONFIGから削除します。

enableDigestAuthentication

Digest認証を有効にします。

getFTPPort

現行のFTPポート番号を戻します。

getHTTPConfigRealm

HTTP構成レルムを戻します。

getHTTPPortgetHTTPSPort

現行のHTTP(S)ポート番号を戻します。

getListenerEndPoint

HTTPサーバーに対するリスナーのエンド・ポイントのパラメータを戻します。

GetRemoteHTTPPortGetRemoteHTTPSPort

現行のリモートHTTP(S)ポートの番号を戻します。

setFTPPort

Oracle XML DB FTPポートを、指定したポート番号に設定します。

setHTTPConfigRealm

HTTP構成レルムを設定します。

setHTTPPortsetHTTPSPort

Oracle XML DB HTTP(S)ポートを、指定したポート番号に設定します。

setListenerEndPoint

HTTPサーバーに対するリスナーのエンド・ポイントのパラメータを設定します。

setListenerLocalAccess

すべてのリスナーのエンド・ポイントを、(a) localhostインタフェースでのみリスニングするように制限するか、(b) localhostインタフェースと非localhostインタフェースの両方でリスニングできるようにします。

SetRemoteHTTPPortSetRemoteHTTPSPort

リモートHTTPポートまたはリモートHTTPSポートのポート番号をそれぞれ定義します。リモート・ポート番号が構成ファイルであるxdbconfig.xmlファイルまたは構成XML Schemaであるxdbconfig.xsdで指定されていない場合以外は、リモートでないHTTP(S)ポートに同様に格納されます。

usedPort

同じマルチテナント・コンテナ・データベース(CDB)内のプラガブル・データベース(PDB)によって使用されるポートを戻します。戻り値は、各PDBをID番号別に、関連付けられたポートをタイプおよび番号別にリストするXMLTypeインスタンスです。

例26-6では、ファンクションcfg_getを使用して、Oracle XML DB構成ファイルxdbconfig.xmlを取得しています。

例26-7は、プロシージャcfg_updateの使用方法を説明しています。現行の構成がXMLTypeインスタンスとして取得され、変更されます。続いてcfg_updateを使用してリライトされます。

例26-6 DBMS_XDB_CONFIG.CFG_GETの使用

CONNECT SYSTEM
Enter password: password

Connected.

SELECT DBMS_XDB_CONFIG.cfg_get() FROM DUAL;
 
DBMS_XDB_CONFIG.CFG_GET()
--------------------------------------------------------------------------------
<xdbconfig xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd" xmlns:xsi="http://w
ww.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/x
db/xdbconfig.xsd                                     http://xmlns.oracle.com/xdb
/xdbconfig.xsd">
  <sysconfig>
    <acl-max-age>19</acl-max-age>
    <acl-cache-size>32</acl-cache-size>
    <invalid-pathname-chars/>
    <case-sensitive>true</case-sensitive>
    <call-timeout>6000</call-timeout>
    <max-link-queue>65536</max-link-queue>
    <max-session-use>100</max-session-use>
    <persistent-sessions>false</persistent-sessions>
    <default-lock-timeout>3600</default-lock-timeout>
    <xdbcore-logfile-path>/sys/log/xdblog.xml</xdbcore-logfile-path>
    <xdbcore-log-level>0</xdbcore-log-level>
    <resource-view-cache-size>1048576</resource-view-cache-size>
    <protocolconfig>
      <common>
        . . .
      </common>
      <ftpconfig>
        . . .
      </ftpconfig>
      <httpconfig>
        <http-port>0</http-port>
        <http-listener>local_listener</http-listener>
        <http-protocol>tcp</http-protocol>
        <max-http-headers>64</max-http-headers>
        <max-header-size>16384</max-header-size>
        <max-request-body>2000000000</max-request-body>
        <session-timeout>6000</session-timeout>
        <server-name>XDB HTTP Server</server-name>
        <logfile-path>/sys/log/httplog.xml</logfile-path>
        <log-level>0</log-level>
        <servlet-realm>Basic realm=&quot;XDB&quot;</servlet-realm>
        <webappconfig>
        . . .
        </webappconfig>
        <authentication>
        . . .
        </authentication>
    </protocolconfig>
    <xdbcore-xobmem-bound>1024</xdbcore-xobmem-bound>
    <xdbcore-loadableunit-size>16</xdbcore-loadableunit-size>
    <acl-evaluation-method>ace-order</acl-evaluation-method>
  </sysconfig>
</xdbconfig>
 
1 row selected.

例26-7 DBMS_XDB_CONFIG.CFG_UPDATEの使用

DECLARE
  configxml    SYS.XMLType;
  configxml2   SYS.XMLType;
BEGIN
  -- Get the current configuration
  configxml := DBMS_XDB_CONFIG.cfg_get();
 
  -- Modify the configuration
SELECT XMLQuery(
  'declare default element namespace
   "http://xmlns.oracle.com/xdb/xdbconfig.xsd"; (: :)
   copy $i := $p1 modify
     (for $j in $i/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port
      return replace value of node $j with $p2)
     return $i'
    PASSING CONFIGXML AS "p1", '8000' AS "p2" RETURNING CONTENT)
  INTO configxml2 FROM DUAL;
 
  -- Update the configuration to use the modified version
  DBMS_XDB_CONFIG.cfg_update(configxml2);
END;
/
 
PL/SQL procedure successfully completed.

SELECT DBMS_XDB_CONFIG.cfg_get() FROM DUAL;
 
DBMS_XDB_CONFIG.CFG_GET()
--------------------------------------------------------------------------------
<xdbconfig xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd" xmlns:xsi="http://w
ww.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/x
db/xdbconfig.xsd http://xmlns.oracle.com/xdb/xdbconfig.xsd">
  <sysconfig>
    <acl-max-age>15</acl-max-age>
    <acl-cache-size>32</acl-cache-size>
    <invalid-pathname-chars/>
    <case-sensitive>true</case-sensitive>
    <call-timeout>6000</call-timeout>
    <max-link-queue>65536</max-link-queue>
    <max-session-use>100</max-session-use>
    <persistent-sessions>false</persistent-sessions>
    <default-lock-timeout>3600</default-lock-timeout>
    <xdbcore-logfile-path>/sys/log/xdblog.xml</xdbcore-logfile-path>
    <resource-view-cache-size>1048576</resource-view-cache-size>
    <protocolconfig>
      <common>
      . . .
      </common>
      <ftpconfig>
      . . .
      </ftpconfig>
      <httpconfig>
        <http-port>8000</http-port>
        . . .
      </httpconfig>
    </protocolconfig>
    <xdbcore-xobmem-bound>1024</xdbcore-xobmem-bound>
    <xdbcore-loadableunit-size>16</xdbcore-loadableunit-size>
    <acl-evaluation-method>ace-order</acl-evaluation-method>
</xdbconfig>
 
1 row selected.