访问表 pg_statistic
仅限超级用户,因此普通用户无法从中了解其他用户表的内容。一些选择性估计函数将使用用户提供的操作符(查询中出现的操作符或相关操作符)来分析存储的统计信息。例如,为了确定是否适用存储的常用值,选择性估计器将必须运行适当的 =
操作符以将查询中的常量与存储的值进行比较。因此,pg_statistic
中的数据可能会传递给用户定义的操作符。精心设计的操作符可以故意泄露传递的操作数(例如,通过记录它们或将它们写入不同的表),或者意外地通过在错误消息中显示它们的值而泄露它们,这两种情况都可能将 pg_statistic
中的数据暴露给不应看到数据的用户。
为了防止这种情况,以下内容适用于所有内置选择性估计函数。在规划查询时,为了能够使用存储的统计信息,当前用户必须对表或相关列拥有 SELECT
权限,或者所用操作符必须为 LEAKPROOF
(更准确地说,是操作符基于的函数)。否则,选择性估计器将表现得好像没有统计信息可用,规划器将继续使用默认值或后备假设。
如果用户对表或列没有必要的权限,则在许多情况下,查询最终会收到权限被拒绝的错误,在这种情况下,这种机制在实践中是不可见的。但是,如果用户正在从安全屏障视图中读取数据,则规划器可能希望检查对用户不可访问的基础表的统计信息。在这种情况下,操作符应该是防泄漏的,否则不会使用统计信息。对此没有直接反馈,只是计划可能不理想。如果怀疑是这种情况,可以尝试以具有更多权限的用户身份运行查询,以查看是否会生成不同的计划。
此限制仅适用于规划器需要在来自 pg_statistic
的一个或多个值上执行用户定义的操作符的情况。因此,无论访问权限如何,规划器都允许使用通用统计信息,例如列中空值的比例或不同值的个数。
包含在第三方扩展中的选择性估计函数,这些函数可能会对包含用户定义操作符的统计信息进行操作,应该遵循相同的安全规则。请咨询 PostgreSQL 源代码以获取指导。
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。