更新时间:2023-03-08 GMT+08:00

如何查看某个用户有哪些表的权限?

场景一:查看用户有哪些表的权限,可使用information_schema.table_privileges系统表查看。例如

1
SELECT * FROM information_schema.table_privileges WHERE GRANTEE='user_name'; 

表1 table_privileges字段

字段

数据类型

描述

grantor

sql_identifier

赋权用户。

grantee

sql_identifier

被赋权用户。

table_catalog

sql_identifier

包含该表的数据库名。

table_schema

sql_identifier

包含该表的模式名。

table_name

sql_identifier

表名。

privilege_type

character_data

被赋予的权限类型:SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,ANALYZE,VACUUM,ALTER,DROP或TRIGGER。

is_grantable

yes_or_no

权限是否可赋予其他用户,YES表示可授予,NO表示不可授予。

with_hierarchy

yes_or_no

是否允许在表继承层级上的特定操作。当特定操作为SELECT时显示YES,否则为NO。

如上图所示,表示用户u2拥有Schema u2下的t2的所有权限和Schema u1下的t1的SELECT权限

需注意,在查询有哪些表权限时,information_schema.table_privileges只能查到当前用户被直接授予的权限,而函数has_table_privilege()除了能查询被直接授予的权限外还能查到间接的权限(即GRANT role to user获取的)。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE TABLE t1 (c1 int);
CREATE USER u1 password '********';
CREATE USER u2 password '********';
GRANT dbadmin to u2;     // 间接通过角色成员关系赋予权限
GRANT SELECT on t1 to u1;    // 直接授予权限

SET ROLE u1 password '********';
SELECT * FROM public.t1;    直接授权可以访问表
 c1 
----
(0 rows)

SET ROLE u2 password '********';
SELECT * FROM public.t1;    //间接授权可以访问表
 c1 
----
(0 rows)

RESET role;    //切回到dbadmin
SELECT * FROM information_schema.table_privileges WHERE table_name = 't1';    // information_schema.table_privileges仅能看到直接授权
 grantor |  grantee   | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy
---------+------------+---------------+--------------+------------+----------------+--------------+----------------
 dbadmin | u1         | gaussdb       | public       | t1         | SELECT         | NO           | YES
(1 rows)

SELECT has_table_privilege('u2', 'public.t1', 'select');    // has_table_privilege还可以看到间接授权
 has_table_privilege 
---------------------
 t
(1 row)

场景二:查看用户是否有某张表的权限,可以通过以下方法。

  1. 执行以下语句查询pg_class系统表。

    1
    SELECT * FROM pg_class WHERE relname = 'tablename';
    

    查看relacl字段,该字段回显结果如下,权限参数参见表2

    • "rolename=xxxx/yyyy" --表示rolename对该表有xxxx权限,且权限来自yyyy;
    • "=xxxx/yyyy" -- 表示public对该表有xxxx权限,且权限来自yyyy。

    例如下图:

    joe=arwdDxtA,表示joe用户有所有权限(ALL PRIVILEGES)。

    leo=arw/joe,表示leo用户拥有读、写、改权限,该权限来自joe授权。

    表2 权限的参数说明

    参数

    参数说明

    r

    SELECT(读)

    w

    UPDATE(写)

    a

    INSERT(插入)

    d

    DELETE

    D

    TRUNCATE

    x

    REFERENCES

    t

    TRIGGER

    X

    EXECUTE

    U

    USAGE

    C

    CREATE

    c

    CONNECT

    T

    TEMPORARY

    A

    ANALYZE|ANALYSE

    arwdDxtA

    ALL PRIVILEGES(用于表)

    *

    给前面权限的授权选项

  2. 如果要查某用户对某张表是否有某种权限,也可以通过访问权限查询函数has_table_privilege进行查询。

    1
    SELECT * FROM has_table_privilege('用户名','表名','select');
    

    例如,查询joe对表t1是否有查询权限。

    1
    SELECT * FROM has_table_privilege('joe','t1','select');