更新安全数据库,然后访问 xdmp:permission 中的新角色
Update security db and then access new role in xdmp:permission
我正在使用 xdmp:invoke 调用在安全数据库中创建一个新角色。作为 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>
我的想法是,这将在单独的事务中执行,然后我将能够访问此调用后代码中的更改。但是,当我使用刚创建的角色的名称对 xdmp:permission() 进行 all 时,出现角色不存在错误。
有办法解决吗?
更新
以下代码段有效。所以我会进行更多的故障排除,看看我更复杂的代码中是否还有其他问题。
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')
第二次更新
看来,如果我调用来执行创建角色的函数在另一个 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>
)
};
如果我从查询控制台调用它:
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')
这会出错,因为下面的代码工作正常:
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')
您确认它确实创建了角色吗?如果它实际上没有被创建,请尝试将事务模式更改为 "update-auto-commit"。我怀疑您添加角色的交易实际上并未提交。
此外,如果您所做的只是创建一个角色,使用类似下面的内容可能会更简单,这样您就不必为一小段代码定义单独的 .xqy。
xdmp:invoke-function(
function() { sec:create-role(...) },
<options xmlns="xdmp:eval">
<database>{xdmp:security-database()}</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>)
也考虑通过 invoke-function 获得权限。您正在单独的事务中创建角色,因此当前请求可能会在提交之前查看数据库的状态。这是 MarkLogic 用来支持非锁定查询模式的 MVCC 模型的一部分。
也可能是惰性求值干扰了您的代码。序列中的子表达式(例如任何逗号分隔的表达式)可以并行执行。使用 FLWOR 中的 let-return 来执行命令..
HTH!
我正在使用 xdmp:invoke 调用在安全数据库中创建一个新角色。作为 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>
我的想法是,这将在单独的事务中执行,然后我将能够访问此调用后代码中的更改。但是,当我使用刚创建的角色的名称对 xdmp:permission() 进行 all 时,出现角色不存在错误。
有办法解决吗?
更新
以下代码段有效。所以我会进行更多的故障排除,看看我更复杂的代码中是否还有其他问题。
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')
第二次更新
看来,如果我调用来执行创建角色的函数在另一个 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>
)
};
如果我从查询控制台调用它:
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')
这会出错,因为下面的代码工作正常:
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')
您确认它确实创建了角色吗?如果它实际上没有被创建,请尝试将事务模式更改为 "update-auto-commit"。我怀疑您添加角色的交易实际上并未提交。
此外,如果您所做的只是创建一个角色,使用类似下面的内容可能会更简单,这样您就不必为一小段代码定义单独的 .xqy。
xdmp:invoke-function(
function() { sec:create-role(...) },
<options xmlns="xdmp:eval">
<database>{xdmp:security-database()}</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>)
也考虑通过 invoke-function 获得权限。您正在单独的事务中创建角色,因此当前请求可能会在提交之前查看数据库的状态。这是 MarkLogic 用来支持非锁定查询模式的 MVCC 模型的一部分。
也可能是惰性求值干扰了您的代码。序列中的子表达式(例如任何逗号分隔的表达式)可以并行执行。使用 FLWOR 中的 let-return 来执行命令..
HTH!