支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2

68.3. 规划器统计信息和安全性 #

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

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

如果用户对表或列没有所需的权限,那么在许多情况下,查询最终会收到权限被拒绝的错误,在这种情况下,此机制在实践中是不可见的。但是,如果用户正在从安全屏障视图中读取数据,则规划器可能希望检查用户无法访问的基础表的统计信息。在这种情况下,运算符应该是防泄漏的,否则将不使用统计信息。没有关于此的直接反馈,只是计划可能不是最优的。如果怀疑是这种情况,可以尝试以更高级别的用户身份运行查询,以查看是否会产生不同的计划。

此限制仅适用于规划器需要在 pg_statistic 中的一个或多个值上执行用户定义运算符的情况。因此,允许规划器使用通用的统计信息,例如空值的比例或列中不同值的数量,而不管访问权限如何。

第三方扩展中包含的可能使用用户定义运算符操作统计信息的选择性估计函数应遵循相同的安全规则。请查阅 PostgreSQL 源代码以获取指导。

提交更正

如果您发现文档中有任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表格报告文档问题。