【问题标题】:Why do PSQL \z and information_schema.table_privileges show different details?为什么 PSQL \z 和 information_schema.table_privileges 显示不同的细节?
【发布时间】:2021-07-18 22:58:03
【问题描述】:

我偶然在当前公司担任了 DBA 角色,SO 对我设置有用的查询帮助很大。

我目前正在尝试创建一些视图来协助进行 UAR(用户访问审查)以满足合规性要求并帮助用户解决访问问题。为此,我试图创建一个视图,列出用户名及其对数据库中所有模式中所有表的权限。我从反对information_schema.table_privileges 的观点开始,但注意到它不完整。如果相关,这是在 AWS RDS Postgres 实施中。

为了深入了解,我执行了\z schema_name.table_name,得到了以下输出。一切看起来都很好:我看到拥有所有权限的角色analytics_owner 和具有不同权限级别的六个组角色。 (所有访问数据库的员工和应用程序都被授予这六个角色之一的成员资格。)

pg_class 的查询也显示了这一点:

但如果我查询information_schema.table_privileges,则没有结果。 (事实上​​,如果我删除 where relname = '[table]' 子句,则在 table_privileges 输出中的相关架构中只有两个具有详细信息的表 - 但实际架构中大约有一百个表。)

\z 命令中的权限详细信息未显示在 information_schema.table_privileges 中。我更愿意写出table_privileges 而不是pg_class 的视图,因为我不必解码和分离聚合的ACL 详细信息。但是,看起来 table_privileges 视图有一些非常具体的内容,因为其中只有非常小的实际表子集。

是否有一个查询以与information_schema.table_privileges 中包含的相同格式生成相同的详细信息,但从pg_class 获取数据?或者,table_privileges 有什么不同使其无法显示完整的详细信息,我可以对授予的权限做些什么以使它们在那里可见以便于查看?

【问题讨论】:

  • 您在information_schema 中看到的数据取决于您在运行查询时的角色。以超级用户角色登录时尝试查询。如果您想查看用于information_schema.table_privileges 视图的查询,请在psql 中执行:\d+ information_schema.table_privileges
  • 谢谢@AdrianKlaver!我无权访问真正的超级用户角色,但这很有意义。该视图定义还显示了 acleexplode(),看起来它会派上用场。

标签: postgresql amazon-rds psql


【解决方案1】:

根据 Adrian Klaver 的评论,information_schema 取决于您在运行查询时登录的角色。

【讨论】:

  • 除了角色之外,还有另一个可能的差异来源。 Information_Schema 的内容在 ISO-9075(SQL 标准)中定义。 Postgres 完全有可能不包含它们的扩展,因为它们不包含在标准中。为确保您已确定导航 pg_catalog 所需的所有内容(这不是一件容易的事),但它已被完整记录。
猜你喜欢
  • 2013-12-05
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多