我定义了一个XQuery,可以从Query Console(QC)运行。 我在任务服务器上设置了任务。
查询似乎无法找到搜索到的文档,因此这必须是权限问题,这是我的猜测。
任务查询:
xquery version "1.0-ml";
import module namespace object = "http://marklogic.com/solutions/obi/object" at
"/ext/obi/lib/object-query-lib.xqy",
"/ext/obi/lib/object-service-lib.xqy",
"/ext/obi/lib/object-lib.xqy";
declare namespace obj="http://marklogic.com/solutions/obi/object";
declare namespace alt="http://example.com/sccs/alert";
declare namespace scc="http://example.com/sccs";
declare namespace source="http://marklogic.com/solutions/obi/source";
(: Start task :)
let $_ := xdmp:log("******* START CHECK UPDATE ALERTS TASK *********")
(: Find al active alerts :)
let $alerts := cts:search(
collection("object"),
cts:and-query((
cts:element-range-query(xs:QName("obj:type"), "=", "alert"),
cts:element-range-query(xs:QName("alt:status"), "=", "Active")
(:
cts:element-range-query(xs:QName("alt:device-id"), "=", $device-id)
:)
))
)/obj:object
let $update-object-content := <alert xmlns="http://example.com/sccs/alert">
<obj:property>
<status xmlns="http://example.com/sccs/alert">Inactive</status>
</obj:property>
</alert>
let $now := fn:current-dateTime()
(: minimum duration before alerts turns inactive :)
let $duration-min := xs:dayTimeDuration('PT25M0S') (: defines 30 minutes :)
(: loop over all active alerts :)
let $_ :=
for $a in $alerts
let $a-id := $a//obj:id/text()
let $s-id := $a//source:id/text()[1]
let $timestamp := xdmp:parse-dateTime('[Y0001]-[M01]-[D01]T[h01]:[m01]:[s01]',$a//scc:timestamp/text())
(: if Alert is older then $delta then set status to Inactive :)
let $delta := $now - $timestamp
let $upd := if ($delta > $duration-min) then
(
let $_ := xdmp:log(fn:concat("Update Alert ID : ",$a-id," to INACTIVE."))
let $detail-id := obj:add-details($a-id, $update-object-content, $s-id,())
return $detail-id
)
else ()
return $upd
let $_ := xdmp:log(fn:concat("DEBUG NUM ALERTS:",fn:count($alerts)))
return ()
任务保障:
<scheduled-task>
<task-path>/tasks/update-alerts-to-inactive.xqy</task-path>
<task-root>/</task-root>
<task-type>minutely</task-type>
<task-period>5</task-period>
<task-database name="${content-db}"/>
<task-modules name="${app-modules-db}"/>
<task-user name="${app-name}-user"/>
</scheduled-task>
如果需要将警报对象设置为&#34;非活动状态&#34;该任务每5分钟检查一次。
从日志Error.txt我可以看到任务运行但无法找到文档。
2015-10-26 00:45:00.395 Info: TaskServer: ******* START CHECK UPDATE ALERTS TASK *********
2015-10-26 00:45:00.395 Info: TaskServer: DEBUG NUM ALERTS:0
我在codepoint root collation中运行所有代码,但在此上下文中无法找到任何与taskserver相关的代码。
documentation on permissions needed for the user to perform a task非常隐秘:
在“任务用户和任务主机”字段中,指定用户 权限调用任务和任务的主机 是要被调用。如果未指定主机,则任务将在所有主机上运行 主机。 “任务用户”字段中指定的用户必须具有 执行模块中使用的函数所需的特权。看到 附录B:完整列表的预定义执行权限 执行权限。
问题:为什么app-user无法在任务服务器上找到文档?
更新
尝试获取OBI文档的权限但失败了。
这是代码(由Dave建议)
import module namespace sec="http://marklogic.com/xdmp/security" at
"/MarkLogic/security.xqy";
declare namespace obj="http://marklogic.com/solutions/obi/object";
let $o-id := cts:search(
collection("object"),
cts:and-query((
cts:element-range-query(xs:QName("obj:type"), "=", "alert")
))
)/obj:object/obj:id/text()
let $uri := object:master-uri($o-id)
let $res := for $perm in xdmp:document-get-permissions($uri)
let $role-name := sec:get-role-names($perm/sec:role-id)
return $role-name || ": " || $perm/sec:capability/fn:string()
let $string-uri := '/marklogic.solutions.obi/object/cec48c59-a648-4da5-a758-2b6bb4065279.xml'
return xdmp:document-get-permissions($string-uri)
我在QC上以管理员身份运行它,它返回空序列...
答案 0 :(得分:2)
检查权限部分的最简单方法是在查询控制台中以${app-name}-user}
运行您的代码。以该用户身份连接到Query Console,或者将代码包装在xdmp:eval()中并在选项中指定用户。我希望你能得到同样的结果。
这似乎不是执行权限的问题,因为它似乎确实运行了任务。
在Query Console中,运行以下代码:
import module namespace sec="http://marklogic.com/xdmp/security" at
"/MarkLogic/security.xqy";
for $perm in xdmp:document-get-permissions($uri)
let $role-name := sec:get-role-names($perm/sec:role-id)
return $role-name || ": " || $perm/sec:capability/fn:string()
...用$ uri替换你的一个目标文件的URI。这将告诉您哪些角色对该文档具有哪些权限。现在,您可以检查${app-name}-user
是否具有(或继承)该角色。