在不同于使用 XQuery 处理的数据库上进行查询

Posted

技术标签:

【中文标题】在不同于使用 XQuery 处理的数据库上进行查询【英文标题】:Query on a database different from the one working on with XQuery 【发布时间】:2018-02-17 19:42:23 【问题描述】:

目前我正在开发一个应用程序,该应用程序正在对给定的 MarkLogic 数据库进行查询,我们可以说是默认数据库,但是为了在屏幕上提供相同的值,我必须在显示之前检查登录用户的角色。这可以通过查询安全数据库来完成,该数据库由 MarkLogic 本身提供,但我不知道如何在查询中明确声明我要查询该特定数据库而不是默认数据库。你知道一些可以帮助我的命令吗?谢谢!

【问题讨论】:

【参考方案1】:

您可以使用 eval 查询另一个数据库:

xdmp:eval("doc('/docs/mydoc.xml')",  (),
  <options xmlns="xdmp:eval">
    <database>xdmp:database("otherdb")</database>
  </options>)

见:https://docs.marklogic.com/xdmp:eval

另外,如果您要专门查询安全数据库,那么您可以使用xdmp:security-database 而不是xdmp:security-database

【讨论】:

请记住,如果您需要访问安全数据库中的文档,则该用户将需要安全角色,否则安全数据库将显示为空(由于对所有安全资产的文档权限)。将该角色分配给用户时要小心。相反,请考虑将对安全数据库的访问封装在一个高度受限的函数中,您可以通过该函数获得安全角色,而不是将该角色交给最终用户。.. @grtjn 好建议。另一个想法是围绕具有各种基于角色的权限的文档设计一个查询,这样 OP 希望根据角色有条件地显示的值将只是查询的结果,完全避免查询安全数据库。 你们都提出了关于安全访问的有趣观点。我需要的查询仅用于确定当前用户是否可以看到我正在显示的控制台的某些部分,但我想知道它是否可以用于在服务器上进行某种利用。 @ChiaraDiNardo 这取决于它是如何实现的。如果您从不评估从客户端传递的字符串,那么它可能没问题。正如 grtjn 建议的那样,使用放大器更安全。 实际上,我所做的查询只是根据用户角色显示网站的某些部分而不是其他部分,但是有关他的所有信息都是通过查询安全数据库直接获取的,从它的登录凭据开始,所以它不应该是一个大问题,但作为一个重要的数据库,我想尽可能地限制它的访问。

以上是关于在不同于使用 XQuery 处理的数据库上进行查询的主要内容,如果未能解决你的问题,请参考以下文章

在不确定数量的列上进行 UNPIVOT

我应该执行多个 sql 查询还是一个大型查询并在服务器上进行处理?

K 表示在不均匀大小的簇上进行聚类

使用 PHP 执行 XQuery

无法解析javax.xml.xquery.XQException

XQuery 如何使用 WHERE 查询获取整个 xml 文档