針對模式驗證 XMLTYPE 必須具備哪些條件?
我有一個生成 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 模式之後,一切正常。