首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从任务服务器运行的查询无法找到文档?

从任务服务器运行的查询无法找到文档?
EN

Stack Overflow用户
提问于 2015-10-26 01:17:05
回答 1查看 84关注 0票数 2

我定义了一个可以从查询控制台(QC)运行的XQuery。我在任务服务器上设置了一个任务。

查询似乎找不到搜索到的文档,所以我猜这一定是权限问题。

任务查询:

代码语言:javascript
复制
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 ()

任务防御:

代码语言:javascript
复制
      <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中,我可以看到任务正在运行,但找不到文档。

代码语言:javascript
复制
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所建议的)

代码语言:javascript
复制
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上作为管理员运行,它返回空序列..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-26 13:44:43

检查权限部分的最简单方法是以${app-name}-user}的形式在查询控制台中运行代码。要么以该用户的身份连接到查询控制台,要么将代码包装在xdmp:eval()中,并在选项中指定用户。我希望你也能得到同样的结果。

这似乎不是执行权限的问题,因为任务似乎已运行。

在查询控制台中,运行以下代码:

代码语言:javascript
复制
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是否具有(或继承)该角色。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33337053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档