# 72.3.规划者统计和安全

进入桌子pg_统计仅限于超级用户,因此普通用户无法从中了解其他用户表的内容。一些选择性估计函数将使用用户提供的运算符(查询中出现的运算符或相关运算符)来分析存储的统计信息。例如,为了确定存储的最常用值是否适用,选择性估计器必须运行适当的=运算符将查询中的常量与存储值进行比较。因此pg_统计可能会传递给用户定义的运算符。精心设计的运算符可以故意泄漏传递的操作数(例如,通过记录它们或将它们写入另一个表),或者通过在错误消息中显示它们的值来意外泄漏它们,在这两种情况下,都可能会从pg_统计对于不应该看到它的用户。

为了防止出现这种情况,以下内容适用于所有内置的选择性估计功能。在计划查询时,为了能够使用存储的统计信息,当前用户必须选择表或相关列上的权限,或必须使用的运算符防漏的(更准确地说,是操作员所基于的功能)。如果没有,那么选择性估计器将表现得好像没有可用的统计数据,规划者将继续进行默认或回退假设。

如果用户对表或列没有所需的权限,那么在许多情况下,查询最终将收到一个“权限拒绝”错误,在这种情况下,这种机制实际上是不可见的。但是,如果用户正在从安全屏障视图中读取数据,那么计划者可能希望检查用户无法访问的基础表的统计信息。在这种情况下,操作员应防泄漏,否则将不使用统计数据。除了该计划可能不太理想之外,没有直接的反馈。如果怀疑是这种情况,可以尝试以更具特权的用户身份运行查询,以查看是否会产生不同的计划。

此限制仅适用于计划者需要对来自的一个或多个值执行用户定义运算符的情况pg_统计。因此,无论访问权限如何,计划者都可以使用通用统计信息,例如空值的分数或列中不同值的数量。

第三方扩展中包含的选择性估计函数可能使用用户定义的运算符对统计数据进行操作,它们应该遵循相同的安全规则。参考PostgreSQL源代码获取指导。