查询postgres中表的授予

mar*_*kus 82 sql postgresql grant

如何在postgres中查询授予对象的所有GRANTS?

例如,我有表"mytable":

GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2 
Run Code Online (Sandbox Code Playgroud)

我需要一些能给我的东西:

user1: SELECT, INSERT
user2: UPDATE
Run Code Online (Sandbox Code Playgroud)

CPJ*_*CPJ 92

\z mytable 从psql中获取表格中的所有授权,但您必须由个别用户将其拆分.

  • @ DanielL.VanDenBosch:所有元命令,例如\ z,都用于psql。psql是PostgreSQL的命令行界面。 (2认同)

mar*_*kus 92

我已经找到了:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'
Run Code Online (Sandbox Code Playgroud)


Nic*_*art 28

如果你真的想要每个用户一行,你可以按受让人分组(要求PG9 +用于string_agg)

SELECT grantee, string_agg(privilege_type, ', ') AS privileges
FROM information_schema.role_table_grants 
WHERE table_name='mytable'   
GROUP BY grantee;
Run Code Online (Sandbox Code Playgroud)

这应该输出如下:

 grantee |   privileges   
---------+----------------
 user1   | INSERT, SELECT
 user2   | UPDATE
(2 rows)
Run Code Online (Sandbox Code Playgroud)


小智 24

请尝试以下查询.它将为您提供表中所有用户及其权限的列表.

select a.tablename,b.usename,HAS_TABLE_PRIVILEGE(usename,tablename, 'select') as select,
  HAS_TABLE_PRIVILEGE(usename,tablename, 'insert') as insert,
  HAS_TABLE_PRIVILEGE(usename,tablename, 'update') as update,
  HAS_TABLE_PRIVILEGE(usename,tablename, 'delete') as delete, 
  HAS_TABLE_PRIVILEGE(usename,tablename, 'references') as references  from pg_tables a , pg_user b 
where a.tablename='your_table_name';
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一能够计算从其他角色的成员身份获得的权限的答案,因此它得到了我的投票.另一方面,我会说`has_table_privilege(usename,contact(schemaname,'.',tablename),...)`以避免歧义. (4认同)

isa*_*pir 7

此查询将列出所有数据库和模式中的所有表(取消注释WHERE子句中的行以过滤特定数据库,模式或表),并按顺序显示权限,以便于查看是否容易查看是否授予特定权限:

SELECT grantee
      ,table_catalog
      ,table_schema
      ,table_name
      ,string_agg(privilege_type, ', ' ORDER BY privilege_type) AS privileges
FROM information_schema.role_table_grants 
WHERE grantee != 'postgres' 
--  and table_catalog = 'somedatabase' /* uncomment line to filter database */
--  and table_schema  = 'someschema'   /* uncomment line to filter schema  */
--  and table_name    = 'sometable'    /* uncomment line to filter table  */
GROUP BY 1, 2, 3, 4;
Run Code Online (Sandbox Code Playgroud)

样本输出:

grantee |table_catalog   |table_schema  |table_name     |privileges     |
--------|----------------|--------------|---------------|---------------|
PUBLIC  |adventure_works |pg_catalog    |pg_sequence    |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_sequences   |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_settings    |SELECT, UPDATE |
...
Run Code Online (Sandbox Code Playgroud)


vis*_*nan 5

添加到@shruti的答案

查询给定用户的架构中所有表的授权

select a.tablename, 
       b.usename, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'select') as select,
       HAS_TABLE_PRIVILEGE(usename,tablename, 'insert') as insert, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'update') as update, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'delete') as delete, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'references') as references 
from pg_tables a, 
     pg_user b 
where schemaname='your_schema_name' 
      and b.usename='your_user_name' 
order by tablename;
Run Code Online (Sandbox Code Playgroud)