ヘッダーをスキップ
Oracle® XML DB開発者ガイド
11gリリース2 (11.2)
B70200-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

26 PL/SQLを使用したリポジトリへのアクセス

この章では、Oracle XML DB Resource API for PL/SQL (PL/SQLパッケージDBMS_XDB)について説明します。内容は次のとおりです。

PL/SQLパッケージDBMS_XDBの概要

PL/SQLパッケージDBMS_XDBは、Oracle XML DBのPL/SQL用リソースAPIです。これは、PL/SQLフォルダリングAPIともいいます。このAPIは、PL/SQLを使用して、Oracle XML DBリポジトリ・リソースにアクセスして管理するためのファンクションとプロシージャを提供します。また、リソースのセキュリティおよびOracle XML DBの構成の管理方法も説明します。

Oracle XML DBリポジトリはXMLでモデル化されており、すべてのデータに対するデータベース・ファイル・システムを提供します。リポジトリは、XMLTypeのデータベース・オブジェクトにパス名(またはURL)をマップし、これらのオブジェクトの管理機能を提供します。

PL/SQLパッケージDBMS_XDBはAPIで、これを使用することにより次のすべてを管理できます。

  • Oracle XML DBリソース

  • Oracle XML DBセキュリティは、アクセス制御リスト(ACL)に基づいています。ACLは、どのリソースへのアクセス権をどのプリンシパル(ユーザーまたはロール)が持つかを決定するアクセス制御エントリ(ACE)のリストです。

  • Oracle XML DBの構成


関連項目:

  • 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

  • 「XML用のAPI」


DBMS_XDB: リソース管理

表26-1は、DBMS_XDBのOracle XML DBリソースの管理用ファンクションおよびプロシージャの説明です。

表26-1 DBMS_XDBのリソース管理用ファンクションおよびプロシージャ

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

appendResourceMetadata

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

createFolder

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

createOIDPath

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

createResource

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

deleteResource

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

deleteResourceMetadata

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

existsResource

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

getLockToken

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

getResOID

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

getXDB_tablespace

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

link

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

lockResource

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

purgeResourceMetadata

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

renameResource

リソースの名前を変更します。

unlockResource

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

updateResourceMetadata

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



ヒント:

リポジトリ・リソースへの問合せのパフォーマンスを最適化するため、リソース作成後にプロシージャDBMS_XDB_ADMIN.gatherRepositoryStatsを使用して、オプティマイザの統計を収集してください。gatherRepositoryStatsを使用するためには、権限ANALYZE ANYを持つXDBADMINロール、またはDBAロールが必要です。


関連項目:

『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

この項の例では、これらのファンクションおよびプロシージャの使用方法を説明します。

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

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

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

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

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

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

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

関連項目:

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

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

表26-2 は、DBMS_XDBのOracle XML DB ACLに基づくセキュリティ管理用ファンクションおよびプロシージャのリストです。

表26-2 DBMS_XDB: セキュリティ管理用のファンクションおよびプロシージャ

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

ACLCheckPrivileges

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

ChangePrivileges

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

checkPrivileges

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

getACLDocument

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

getPrivileges

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

setACL

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



関連項目:

  • 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

  • 『Oracle XML Developer's Kitプログラマーズ・ガイド』


この項の例では、これらのファンクションおよびプロシージャの使用方法を説明します。

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

例26-2 DBMS_XDB.GETACLDOCUMENTの使用

CONNECT hr
Enter password: password

Connected.

DECLARE
  retb BOOLEAN;
BEGIN
  retb := DBMS_XDB.createFolder('/public/mydocs');
  retb := DBMS_XDB.createResource('/public/mydocs/emp_selby.xml',
                                  '<emp_name>selby</emp_name>');
END;
/
PL/SQL procedure successfully completed.
 
SELECT XMLSerialize(DOCUMENT
                    DBMS_XDB.getACLDocument('/public/mydocs/emp_selby.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML')ASCL
--------------------------------------------------------------------------------
<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では、システム管理者がプロシージャsetACLに接続して、所有者(データベース・スキーマHR)に、例26-2で作成されたファイル・リソースにおけるすべての権限を付与しています。プロシージャgetACLDocumentは、続いて<principal>ユーザーが所有者(HR)であるdav:ownerであることを示しています。

例26-3 DBMS_XDB.SETACLの使用

CONNECT SYSTEM
Enter password: password

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

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

XMLSERIALIZE(DOCUMENTDBMS_XDB.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML')ASCL
--------------------------------------------------------------------------------
<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では、ユーザーHRがファンクションchangePrivilegesに接続して、新しいアクセス制御エントリ(ACE)をACLに追加して、リソースemp_selby.xmlにおけるすべての権限をユーザーoeに付与しています。プロシージャgetACLDocumentは、新しいACEがACLに追加されたことを示します。

例26-4 DBMS_XDB.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.changePrivileges('/public/mydocs/emp_selby.xml', ace);
END;
/
 
PL/SQL procedure successfully completed.

COMMIT;

SELECT XMLSerialize(DOCUMENT
                    DBMS_XDB.getACLDocument('/public/mydocs/emp_selby.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML')ASCL
--------------------------------------------------------------------------------
<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では、ユーザーoeは接続してDBMS_XDB.getPrivilegesをコールし、リソースemp_selby.xmlでユーザーoeに付与されたすべての権限を表示します。

例26-5 DBMS_XDB.GETPRIVILEGESの使用

CONNECT oe
Enter password: password

Connected.

SELECT XMLSerialize(DOCUMENT
                    DBMS_XDB.getPrivileges('/public/mydocs/emp_selby.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB.GETPRIVILEGES('/PUBLIC/MYDOCS/EMP_SELBY.XML')ASCLO
--------------------------------------------------------------------------------
<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.

DBMS_XDB: 構成管理

表26-3は、DBMS_XDBのOracle XML DBの構成管理用ファンクションおよびプロシージャの説明です。

表26-3 DBMS_XDB: 構成管理用のファンクションおよびプロシージャ

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

CFG_Get

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

CFG_Refresh

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

cfg_update

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

getFTPPort

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

getHTTPPort

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

setFTPPort

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

setHTTPPort

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



関連項目:

『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

この項の例では、これらのファンクションおよびプロシージャの使用方法を説明します。

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

例26-6 DBMS_XDB.CFG_GETの使用

CONNECT SYSTEM
Enter password: password

Connected.

SELECT DBMS_XDB.cfg_get() FROM DUAL;
 
DBMS_XDB.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は、プロシージャcfg_updateの使用方法を説明しています。現行の構成がXMLTypeインスタンスとして取得され、変更されます。続いてcfg_updateを使用してリライトされます。

例26-7 DBMS_XDB.CFG_UPDATEの使用

DECLARE
  configxml    SYS.XMLType;
  configxml2   SYS.XMLType;
BEGIN
  -- Get the current configuration
  configxml := DBMS_XDB.cfg_get();
 
  -- Modify the configuration
  SELECT updateXML(
           configxml,
           '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',
           '8000',
           'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"')
    INTO configxml2 FROM DUAL;
 
  -- Update the configuration to use the modified version
  DBMS_XDB.cfg_update(configxml2);
END;
/
 
PL/SQL procedure successfully completed.

SELECT DBMS_XDB.cfg_get() FROM DUAL;
 
DBMS_XDB.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.