Oracle

針對模式驗證 XMLTYPE 必須具備哪些條件?

  • April 17, 2013

我有一個生成 XMLTYPE 的過程,我想根據模式驗證它。問題是執行 createSchemaBasedXML 似乎存在權限問題,因為當我以 AUTHID DEFINER 執行該過程時,它會給出錯誤“ORA-31050:訪問被拒絕”,但是當我以 AUTHID CURRENT_USER 執行它時,它實際上返回了一個驗證特定錯誤(我將單獨處理)。CURRENT_USER 不是可接受的解決方案。

我的假設是 CURRENT_USER 有效,因為使用者具有 XMLADMIN 角色。授予角色包含的權限並不能解決問題,因此必須是角色能夠繞過 ACL。

問題是,查詢保護資源的 ACL 的 RESOURCE_VIEW 表明它受/sys/acls/all_owner_acl.xml. DBMS_XDB.getPrivileges表明xsd具有以下所有權限:

 <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/>

使用DBMS_XDB.getAclDocument顯示主體dav:owner具有所有權限,因此這一定不足以讓架構的所有者創建基於架構的 XML。考慮到這個想法,我創建了一個塊來執行DBMS_XDB.createResource創建一個新的 ACL。我可以成功創建 ACL,並且從 SQLDeveloper 中我可以看到它存在於我創建它的位置。

在這個過程中有很多地方我可能會出錯,所以我正在尋找的核心是:

針對模式驗證 XMLTYPE 必須具備哪些條件?

=== 2013 年 4 月 3 日更新 ===

我可以將我的 xsd 文件的 acl 設置/sys/acls/all_all_acl.xml/sys/acls/all_owner_acl.xml. 和以前一樣,這些都不能解決權限問題。我還嘗試了使用從 all_owner_acl.xl 複製的 acl 定義並使用與 /sys/acls/ 的那些文件相同的路徑的 createResource。這至少成功地設置了 ACL。我已為我的所有 XSD 執行它並查詢 RESOURCE_VIEW 以確認它們已設置為新的 ACL。儘管如此,createSchemaBasedXML 仍然給出拒絕訪問錯誤。我的 ACL 是否正確或可能還有其他問題?

<acl xmlns="http://xmlns.oracle.com/xdb/acl.xsd" 
  xmlns:dav="DAV:" 
  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" shared="true">
      <ace>
        <grant>true</grant>
        <principal>MY_ORACLE_USER</principal>
        <privilege>
          <all/>
        </privilege>
      </ace>
    </acl>

=== 2013 年 4 月 9 日更新 ===

我有一個匿名塊,可以根據模式成功驗證 XML。這再次指出了一個權限問題,該問題允許在啟用角色時工作,但在角色不可用時不能工作。

== 2013 年 4 月 12 日更新 ===

我得到的每一點證據似乎都表明我的 ACL 有問題,或者更可能是我設置 ACL 的方式有問題。即使我已根據 dba_tab_privs 授予該角色提供的所有權限,將 XDBADMIN 角色從使用者手中拿走也會導致匿名塊失敗並出現拒絕訪問錯誤。我的 setACL 遵循這種形式:

DBMS_XDB.setACL('/sys/schemas/MY_ORACLE_USER/account.xsd', '/sys/acls/acl_acc.xml');

可以在Oracle 社區上找到完整的測試案例。

我的測試案例在多個其他數據庫和多個來源(包括 oracle 支持)上執行良好,詢問匿名使用者是否已被刪除。儘管沒有,但在沒有完全理解的情況下進行了一些 XML DB 儲存庫更改。為了解決這個問題,我使用註釋 1292089.1 重新安裝了 XDB。這使我的測試案例能夠正常工作,並且在刪除創建的類型和表並重新註冊我們的 XML 模式之後,一切正常。

引用自:https://dba.stackexchange.com/questions/39092