You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MarkLogic统计用户External Name数量返回值始终为0如何排查

External Name

在MarkLogic使用过程中,统计用户External Name数量的执行结果始终返回0,不确定是否遗漏了必要代码,当前使用的实现代码如下:

let $externalcnt := fn:count(xdmp:user-external-security(fn:data(fn:doc($user)/sec:user/sec:user-id)))
     return fn:concat('Num External Names: "', $externalcnt,'"'),

执行结果截图

请帮忙定位该返回值异常的原因,确认代码实现是否存在问题。


异常原因排查

代码返回0是四类典型问题导致的:

  • 执行上下文错误:所有用户安全配置数据都存储在专用的Security数据库中,如果执行这段代码时没有将查询上下文切换到Security库,fn:doc($user)根本读不到目标用户配置文档,后续路径取值返回空序列,计数结果自然为0。
  • 函数调用错误:xdmp:user-external-security()的返回值是用户关联的外部安全配置对象,不是用户绑定的External Name列表,统计外部名称数量应该使用安全模块内置函数sec:user-get-external-names(),该函数直接接收用户ID作为入参,返回对应用户所有绑定的外部名称序列。
  • 权限或命名空间缺失:如果执行代码的账号没有security角色或manage-user权限,读取Security库文档、调用安全类函数时会被权限拦截,无显式报错直接返回空结果;如果没有在XQuery开头声明sec命名空间,路径表达式里的sec:user、sec:user-id节点无法被正确匹配,同样会返回空值。
  • 变量未赋值:你贴出的代码片段中$user变量没有显式赋值,如果实际运行时没有提前给该变量传入正确的用户文档URI,也会导致取值为空。
修正后可运行代码

执行前先将查询上下文切换到Security数据库,给执行账号分配对应安全权限:

xquery version "1.0-ml";
import module namespace sec = "http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";

(: 直接通过用户名取用户ID,不需要手动读取用户文档,容错性更高 :)
let $target-user-id := xdmp:user("替换为你要统计的目标用户名")
let $external-name-list := sec:user-get-external-names($target-user-id)
return fn:concat('Num External Names: "', fn:count($external-name-list),'"')

内容的提问来源于stack exchange,提问作者thichxai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:06:33