Postgres:如何检查用户是否可以在不使用 information_schema.role_table_grants 的情况下授予表权限?

问题描述 投票:0回答:1

我需要找到一种方法来检查是否可以使用 pg_catalog 授予表上的某些权限(选择、更新等)。我只能找到一种方法来查看是否可以使用 information_schema.role_table_grants (列 is_grantable )授予权限,但在我的任务中我不能使用 information_schema,只能使用 pg_catalog。

请分享一些关于这个问题的知识。我感觉我已经检查了 pg_catalog 中的每个视图。

我已经检查了所有视图,甚至是与 pg_catalog 中的角色稍微相关的名称。找不到任何东西。

postgresql privileges
1个回答
0
投票

当然!使用 PostgreSQL 时,您确实可以使用

pg_catalog
系统目录视图检查是否授予权限(例如 SELECT、UPDATE 等)。虽然
information_schema.role_table_grants
是检索此信息的便捷方法,但我了解您需要一种仅使用
pg_catalog
的替代方法。

以下是实现此目标的几种方法:

1. 使用

pg_class
pg_roles
:您可以查询 pg_class 目录表以获取有关表的信息,并查询
pg_roles
目录表以检索有关角色(用户和组)的详细信息。具体来说,您可以查看
pg_class
中的 relacl 列来确定对特定表授予的权限。这是一个示例查询:


SELECT
    a.schemaname,
    a.tablename,
    b.usename,
    HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'select') AS has_select,
    HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'insert') AS has_insert,
    HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'update') AS has_update,
    HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'delete') AS has_delete,
    HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'references') AS has_references
FROM pg_tables a, pg_user b
WHERE a.schemaname = 'your_schema_name' AND a.tablename = 'your_table_name';

将“your_schema_name”和“your_table_name”替换为您感兴趣的实际架构和表名称。此查询将为您提供指定 table1 上的用户列表及其相应权限。

2. 聚合每个用户的权限:如果您想要每个用户一行的更简洁输出,您可以按受让人(用户)对结果进行分组,并使用 string_agg 连接权限类型。这是一个例子:

SELECT
    grantee,
    string_agg(privilege_type, ', ') AS privileges
FROM information_schema.role_table_grants
WHERE table_name = 'your_table_name'
GROUP BY grantee;

此查询将显示与 pg_dump 输出类似的确切 GRANT 语句1。 请记住将“your_schema_name”和“your_table_name”替换为适合您的用例的值。这些查询应该可以帮助您直接从 pg_catalog 检索所需的信息

© www.soinside.com 2019 - 2024. All rights reserved.