对表pg_statistic的访问仅限于超级用户,这样普通用户就无法借此了解其他用户表中的内容。有些选择率估算函数会使用用户提供的操作符(查询中出现的操作符或与之相关的操作符)来分析已存储的统计信息。例如,为了判断某个已存储的高频值是否适用,选择率估算器必须运行合适的=操作符,将查询中的常量与已存储的值进行比较。因此,pg_statistic中的数据有可能被传递给用户定义的操作符。精心构造的操作符可以故意泄露传给它的操作数(例如记录到日志中,或写入另一张表),也可能无意中通过在错误消息中显示其值而泄露它们;无论哪种情况,都可能把pg_statistic中的数据暴露给本不应看到这些数据的用户。
为了防止这种情况,以下规则适用于所有内置选择率估算函数。在规划查询时,若要使用已存储的统计信息,当前用户必须对该表或相关列具有SELECT权限,或者所用操作符必须是LEAKPROOF(更准确地说,是该操作符所基于的函数必须如此)。否则,选择率估算器会像不存在可用统计信息一样工作,规划器则会按默认或后备假设继续。psql程序的\do+元命令可用于确定哪些操作符被标记为 leak-proof。
如果用户对表或列不具备所需权限,那么在许多情况下,查询最终都会收到一个权限被拒绝的错误,因此这一机制在实际中是不可见的。但如果用户是通过安全屏障视图读取数据,规划器可能会想要检查一个用户本来无权访问的底层表的统计信息。在这种情况下,操作符应当是 leak-proof,否则统计信息不会被使用。对此没有直接反馈,除非计划可能不是最优的。如果怀疑发生了这种情况,可以尝试让权限更高的用户运行该查询,看看是否会得到不同的计划。
此限制只适用于规划器需要对来自pg_statistic的一个或多个值执行用户定义操作符的情况。因此,不论访问权限如何,规划器仍可使用通用统计信息,例如空值比例或列中不同值的数量。
第三方扩展中的选择率估算函数如果可能会用用户定义的操作符处理统计信息,也应遵循同样的安全规则。可参考 PostgreSQL 源代码。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。