我定义了一个可以从查询控制台(QC)运行的XQuery。我在任务服务器上设置了一个任务。
查询似乎找不到搜索到的文档,所以我猜这一定是权限问题。
任务查询:
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>该任务每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我在代码点根排序规则中运行所有代码,但在此上下文中无法在任务服务器中找到任何wrt。
关于用户执行任务所需权限的文档非常神秘:
在“任务用户”和“任务主机”字段中,指定具有调用任务权限的用户和要在其上调用任务的主机。如果未指定主机,则该任务将在所有主机上运行。在Task user字段中指定的用户必须具有执行模块中使用的函数所需的权限。有关执行特权的完整列表,请参见附录B:预定义的执行特权。
问题:为什么应用程序用户在任务服务器上找不到文档?
更新
试图获得对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上作为管理员运行,它返回空序列..。
发布于 2015-10-26 13:44:43
检查权限部分的最简单方法是以${app-name}-user}的形式在查询控制台中运行代码。要么以该用户的身份连接到查询控制台,要么将代码包装在xdmp:eval()中,并在选项中指定用户。我希望你也能得到同样的结果。
这似乎不是执行权限的问题,因为任务似乎已运行。
在查询控制台中,运行以下代码:
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是否具有(或继承)该角色。
https://stackoverflow.com/questions/33337053
复制相似问题