TJ *_*ang 1 marklogic marklogic-8
我正在使用xdmp:invoke调用在安全数据库中创建一个新角色.作为调用调用的选项,我指定了以下选项:
<options xmlns="xdmp:eval">
<database>{ xdmp:security-database() }</database>
<transaction-mode>update</transaction-mode>
<isolation>different-transaction</isolation>
<prevent-deadlocks>false</prevent-deadlocks>
</options>
Run Code Online (Sandbox Code Playgroud)
我的想法是,这将在一个单独的事务中执行,然后我将能够访问此调用后代码中的更改.但是当我使用我刚刚创建的角色的名称为xdmp:permission()创建一个all时,我得到一个Role Does Not Exist错误.
无论如何要解决这个问题?
更新
以下代码段有效.所以我会解决更多问题,看看我的更复杂的代码中是否还有其他问题.
xquery version "1.0-ml";
import module namespace sec = "http://marklogic.com/xdmp/security"
at "/MarkLogic/security.xqy";
let $create_role :=
xdmp:invoke-function(
function() {
sec:create-role(
'sec_test',
'Security Test Role',
(),
(),
()
)
},
<options xmlns="xdmp:eval">
<database>{xdmp:security-database()}</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>
)
return xdmp:permission('sec_test', 'read')
Run Code Online (Sandbox Code Playgroud)
第二次更新
似乎如果我调用的函数执行create-role是在另一个xqy文件中,那么它将失败并找不到角色错误.例如,我在security-util.xqy中有以下模块.
xquery version "1.0-ml";
module namespace asu = "http://ir.abbvie.com/marklogic/authorization/lib/security-util";
import module namespace sec = "http://marklogic.com/xdmp/security"
at "/MarkLogic/security.xqy";
declare option xdmp:mapping "false";
declare function asu:create-role-2(
$role_name as xs:string
)
{
xdmp:invoke-function(
function() {
sec:create-role(
$role_name,
"Role auto created by AbbVie authorization library.",
(),
(),
()
)
},
<options xmlns="xdmp:eval">
<database>{ xdmp:security-database() }</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>
)
};
Run Code Online (Sandbox Code Playgroud)
如果我从查询控制台调用它:
xquery version "1.0-ml";
import module namespace asu = "http://ir.abbvie.com/marklogic/authorization/lib/security-util"
at "security-util.xqy";
asu:create-role-2('sec_test7'), xdmp:permission('sec_test7', 'read')
Run Code Online (Sandbox Code Playgroud)
那会出错,因为以下工作正常:
xquery version "1.0-ml";
import module namespace sec = "http://marklogic.com/xdmp/security"
at "/MarkLogic/security.xqy";
declare function local:create-role(
$role_name as xs:string
)
{
xdmp:invoke-function(
function() {
sec:create-role(
$role_name,
"Security Test Role",
(),
(),
()
)
},
<options xmlns="xdmp:eval">
<database>{ xdmp:security-database() }</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>
)
};
local:create-role('sec_test8'), xdmp:permission('sec_test8', 'read')
Run Code Online (Sandbox Code Playgroud)
考虑通过invoke-function获取权限.您正在单独的事务中创建角色,因此当前请求可能在该提交之前查看数据库的状态.这是MarkLogic用于支持非锁定查询模式的MVCC模型的一部分.
也可能是懒惰的评估会扰乱您的代码.序列中的子表达式(例如,以逗号分隔的任何内容)可以并行执行.使用FLWOR的let-return来强制执行订单..
HTH!