
# 如何查看DWS某个用户有哪些表的权限？
**场景一：** **查看用户有哪些表的权限**，可使用information_schema.table_privileges系统表查看。例如
```
SELECT * FROM information_schema.table_privileges WHERE GRANTEE='user_name';
```
![](https://support.huaweicloud.com/dws_faq/figure/zh-cn_image_0000001439795569.png "点击放大")
表1table_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获取的）。例如：
```
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系统表。 
   ```
   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授权。
   ![](https://support.huaweicloud.com/dws_faq/figure/zh-cn_image_0000001117912942.png "点击放大")
    表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进行查询。 
   ```
   SELECT * FROM has_table_privilege('用户名','表名','select');
   ```
   例如，查询joe对表t1是否有查询权限。
   ```
   SELECT * FROM has_table_privilege('joe','t1','select');
   ```
   ![](https://support.huaweicloud.com/dws_faq/figure/zh-cn_image_0000001118137728.png "点击放大")
   
   
