この章では、Oracle XML DB Resource API for PL/SQL(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の構成
表26-1 は、DBMS_XDB
のOracle XML DBリソースの管理用ファンクションおよびプロシージャの説明です。
表26-1 DBMS_XDBのリソース管理用ファンクションおよびプロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
|
ユーザー定義のメタデータをリソースに追加します。 |
|
新しいフォルダ・リソースを作成します。 |
|
オブジェクト識別子(OID)に基づいてリソースへの仮想パスを作成します。 |
|
新しいファイル・リソースを作成します。 |
|
リポジトリからリソースを削除します。 |
|
指定したユーザー定義のメタデータをリソースから削除します。 |
|
絶対パスを指定されたリソースが存在するかどうかを示します。 |
|
指定されたリソースのパスを使用して、現行のユーザーに対するリソースのロック・トークンを戻します。 |
|
絶対パスで指定したリソースのオブジェクト識別子(OID)を戻します。 |
|
|
|
既存のリソースへのリンクを作成します。 |
lockResource |
指定されたリソースのパスを使用して、WebDAV形式のロックを取得します。 |
|
ユーザー |
|
すべてのユーザー定義のメタデータをリソースから削除します。 |
|
インポートまたはエクスポート操作の後で、リポジトリの階層索引を再構築します。 |
|
リソースの名前を変更します。 |
|
ロック・トークンとパスで指定したリソースのロックを解除します。 |
|
ユーザー定義のリソース・メタデータを変更します。 |
関連項目: 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』 |
この項の例では、これらのファンクションおよびプロシージャの使用方法を説明します。
例26-1 DBMS_XDBを使用したリソースの管理
この例では、パッケージDBMS_XDB
を使用してリポジトリ・リソースを管理します。次のものが作成されます。
フォルダ/public
の下にフォルダmydocs
2つのファイル・リソースemp_selby.xml
およびemp_david.xml
ファイル・リソースへの2つのリンクperson_selby.xml
およびperson_david.xml
続いて、新しく作成されたリソースとリンクが削除されます。フォルダを削除する前にフォルダの内容が削除されます。
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.
表26-2 は、DBMS_XDB
のOracle XML DB ACLに基づくセキュリティ管理用ファンクションおよびプロシージャのリストです。
表26-2 DBMS_XDB: セキュリティ管理用のファンクションおよびプロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
|
現行のユーザーに付与されたすべてのアクセス権限をACLで確認します。 |
|
リソースACLにACEを追加します。 |
|
現行のユーザーに付与された、あるリソースへのアクセス権限を確認します。 |
|
リソースのパス名で指定された、リソースを保護しているACL文書を取得します。 |
|
現行のユーザーに付与された、あるリソースへのすべての権限を戻します。 |
|
リソースにACLを設定します。 |
関連項目:
|
この項の例では、これらのファンクションおよびプロシージャの使用方法を説明します。
例26-2 プロシージャDBMS_XDB.getACLDocumentの使用
この例では、データベースのサンプル・スキーマ・ユーザーhr
が、フォルダ/public/mydocs
と、それに含まれるファイルemp_selby.xml
の、2つのリソースを作成します。プロシージャgetACLDocument
がファイル・リソースでコールされて、文書の<principal>
ユーザーがPUBLIC
であることを示しています。
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 DBMS_XDB.getACLDocument('/public/mydocs/emp_selby.xml').getCLOBVal() FROM DUAL; DBMS_XDB.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML').GETCLOBVAL() -------------------------------------------------------------------------------- <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"> <ace> <principal>PUBLIC</principal> <grant>true</grant> <privilege> <all/> </privilege> </ace> </acl> 1 row selected.
例26-3 プロシージャDBMS_XDB.setACLの使用
この例では、システム管理者がプロシージャsetACL
に接続して、所有者(hr
)に、例26-2で作成されたファイル・リソースにおけるすべての権限を付与しています。プロシージャgetACLDocument
は、続いて<principal>
ユーザーが所有者(hr
)であるdav:owner
であることを示しています。
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 DBMS_XDB.getACLDocument('/public/mydocs/emp_selby.xml').getCLOBVal() FROM DUAL; DBMS_XDB.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML').GETCLOBVAL() -------------------------------------------------------------------------------- <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"> <ace> <principal>dav:owner</principal> <grant>true</grant> <privilege> <all/> </privilege> </ace> </acl> 1 row selected.
例26-4 ファンクションDBMS_XDB.changePrivilegesの使用
この例では、ユーザーhr
がファンクションchangePrivileges
に接続して、新しいアクセス制御エントリ(ACE)をACLに追加して、リソースemp_selby.xml
におけるすべての権限をユーザーoe
に付与しています。プロシージャgetACLDocument
は、新しいACEがACLに追加されたことを示します。
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. SELECT DBMS_XDB.getACLDocument('/public/mydocs/emp_selby.xml').getCLOBVal() FROM DUAL; DBMS_XDB.GETACLDOCUMENT('/PUBLIC/MYDOCS/EMP_SELBY.XML').GETCLOBVAL() -------------------------------------------------------------------------------- <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> <principal>dav:owner</principal> <grant>true</grant> <privilege> <all/> </privilege> </ace> <ace> <principal>OE</principal> <grant>true</grant> <privilege> <all/> </privilege> </ace> </acl> 1 row selected.
例26-5 ファンクションDBMS_XDB.getPrivilegesの使用
この例では、ユーザーoe
は接続してDBMS_XDB.getPrivileges
をコールし、リソースemp_selby.xml
でユーザーoe
に付与されたすべての権限を表示します。
CONNECT oe Enter password: password Connected. SELECT DBMS_XDB.getPrivileges('/public/mydocs/emp_selby.xml') FROM DUAL; DBMS_XDB.GETPRIVILEGES('/PUBLIC/MYDOCS/EMP_SELBY.XML').GETCLOBVAL() -------------------------------------------------------------------------------- <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/> <update/> <link/> <unlink/> <read-acl/> <write-acl-ref/> <update-acl/> <resolve/> <link-to/> <unlink-from/> <dav:lock/> <dav:unlock/> </privilege> 1 row selected.
表26-3は、DBMS_XDB
のOracle XML DBの構成管理用ファンクションおよびプロシージャの説明です。
表26-3 DBMS_XDB: 構成管理用のファンクションおよびプロシージャ
ファンクションおよびプロシージャ | 説明 |
---|---|
|
現行セッションの構成情報を戻します。 |
|
現行のOracle XML DB構成ファイル |
|
Oracle XML DB構成情報を更新します。構成ファイル |
|
現行のFTPポート番号を戻します。 |
|
現行のHTTPポート番号を戻します。 |
|
Oracle XML DB FTPポートを、指定したポート番号に設定します。 |
|
Oracle XML DB HTTPポートを、指定したポート番号に設定します。 |
関連項目: 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』 |
この項の例では、これらのファンクションおよびプロシージャの使用方法を説明します。
例26-6 ファンクションDBMS_XDB.cfg_getの使用
この例では、ファンクションcfg_get
を使用してOracle XML DB構成ファイルxdbconfig.xml
を取得しています。
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>900</acl-max-age> <acl-cache-size>32</acl-cache-size> <invalid-pathname-chars>,</invalid-pathname-chars> <case-sensitive>true</case-sensitive> <call-timeout>300</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/> <xdbcore-log-level>0</xdbcore-log-level> <resource-view-cache-size>1048576</resource-view-cache-size> <protocolconfig> <common> . . . </common> <ftpconfig> . . . </ftpconfig> <httpconfig> <http-port>8000</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/> <log-level>0</log-level> <servlet-realm>Basic realm="XDB"</servlet-realm> <webappconfig> . . . </webappconfig> </httpconfig> </protocolconfig> <xdbcore-xobmem-bound>1024</xdbcore-xobmem-bound> <xdbcore-loadableunit-size>16</xdbcore-loadableunit-size> </sysconfig> </xdbconfig> 1 row selected.
例26-7 プロシージャDBMS_XDB.cfg_updateの使用
この例は、プロシージャcfg_update
の使用方法を説明しています。現行の構成がXMLType
インスタンスとして取得され、変更されます。続いて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>900</acl-max-age> <acl-cache-size>32</acl-cache-size> <invalid-pathname-chars>,</invalid-pathname-chars> <case-sensitive>true</case-sensitive> <call-timeout>300</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/> <xdbcore-log-level>0</xdbcore-log-level> <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> </sysconfig> </xdbconfig> 1 row selected.