如何查看某个用户有哪些表的权限?
场景一:查看用户有哪些表的权限,可使用information_schema.table_privileges系统表查看。例如
1
|
SELECT * FROM information_schema.table_privileges WHERE GRANTEE='user_name'; |
字段 |
数据类型 |
描述 |
---|---|---|
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) |
场景二:查看用户是否有某张表的权限,可以通过以下方法。
- 执行以下语句查询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授权。
- 如果要查某用户对某张表是否有某种权限,也可以通过访问权限查询函数has_table_privilege进行查询。
1
SELECT * FROM has_table_privilege('用户名','表名','select');
例如,查询joe对表t1是否有查询权限。
1
SELECT * FROM has_table_privilege('joe','t1','select');