Marklogic 更新安全数据库,然后访问xdmp中的新角色:权限
我正在使用xdmp:invoke调用在安全数据库中创建一个新角色。作为调用调用的选项,我指定了以下选项:Marklogic 更新安全数据库,然后访问xdmp中的新角色:权限,marklogic,marklogic-8,Marklogic,Marklogic 8,我正在使用xdmp:invoke调用在安全数据库中创建一个新角色。作为调用调用的选项,我指定了以下选项: <options xmlns="xdmp:eval"> <database>{ xdmp:security-database() }</database> <transaction-mode>update</transaction-mode> <isolation>different-transaction&
<options xmlns="xdmp:eval">
<database>{ xdmp:security-database() }</database>
<transaction-mode>update</transaction-mode>
<isolation>different-transaction</isolation>
<prevent-deadlocks>false</prevent-deadlocks>
</options>
这将出错,如下所示可以正常工作:
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')
xquery版本“1.0-ml”;
导入模块命名空间sec=”http://marklogic.com/xdmp/security"
位于“/MarkLogic/security.xqy”;
声明函数本地:创建角色(
$role\u名称为xs:string
)
{
xdmp:调用函数(
函数(){
第二节:创建角色(
$role\u name,
“安全测试角色”,
(),
(),
()
)
},
{xdmp:security-database()}
更新自动提交
不同交易
)
};
本地:创建角色('sec_test8'),xdmp:permission('sec_test8','read'))
您是否验证了它实际创建了角色?如果没有实际创建,请尝试将事务模式更改为“更新自动提交”。我怀疑你添加角色的转换实际上没有得到承诺
此外,如果您所做的只是创建一个角色,那么使用下面的内容可能会更简单,这样您就不必为一小段代码定义单独的.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>)
xdmp:invoke函数(
函数(){sec:create role(…)},
{xdmp:security-database()}
更新自动提交
不同交易
)
您是否验证了它实际创建了角色?如果没有实际创建,请尝试将事务模式更改为“更新自动提交”。我怀疑你添加角色的转换实际上没有得到承诺
此外,如果您所做的只是创建一个角色,那么使用下面的内容可能会更简单,这样您就不必为一小段代码定义单独的.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>)
xdmp:invoke函数(
函数(){sec:create role(…)},
{xdmp:security-database()}
更新自动提交
不同交易
)
也可以考虑通过调用函数获取权限。您正在一个单独的事务中创建角色,因此当前请求可以在提交之前查看数据库的状态。这是MarkLogic用于支持非锁定查询模式的MVCC模型的一部分
也可能是懒惰的计算干扰了您的代码。序列中的子表达式(例如,任何逗号分隔的子表达式)都可以并行执行。使用FLWOR的let return强制执行订单
嗯 也可以考虑通过调用函数获取权限。您正在一个单独的事务中创建角色,因此当前请求可以在提交之前查看数据库的状态。这是MarkLogic用于支持非锁定查询模式的MVCC模型的一部分 也可能是懒惰的计算干扰了您的代码。序列中的子表达式(例如,任何逗号分隔的子表达式)都可以并行执行。使用FLWOR的let return强制执行订单
嗯 这就是我正在做的。正在创建角色,因为在我得到错误后,如果我转到管理界面,我可以看到在那里创建的角色。实际上,在调用sec:create role之后,我调用了xdmp:commit()。我更改了选项以匹配您的建议。。。但是,同样的错误。创建角色的调用在另一个.xqy文件中,但这应该会影响任何事情,对吗?我用一个简单的测试片段更新了我的问题,效果很好。。所以我的代码一定有问题。这就是我正在做的。正在创建角色,因为在我得到错误后,如果我转到管理界面,我可以看到在那里创建的角色。实际上,在调用sec:create role之后,我调用了xdmp:commit()。我更改了选项以匹配您的建议。。。但是,同样的错误。创建角色的调用在另一个.xqy文件中,但这应该会影响任何事情,对吗?我用一个简单的测试片段更新了我的问题,效果很好。。所以我的代码一定有问题。谢谢Geert。将xdmp:permission()调用放在调用函数中解决了我的问题。谢谢Geert。将xdmp:permission()调用放在调用函数中解决了我的问题。
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')
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>)