Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Marklogic 更新安全数据库,然后访问xdmp中的新角色:权限_Marklogic_Marklogic 8 - Fatal编程技术网

Marklogic 更新安全数据库,然后访问xdmp中的新角色:权限

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&

我正在使用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>
这将出错,如下所示可以正常工作:

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