PostgreSQL 用户及权限管理

数据库关系型数据库技术服务知识库
前言

对于数据库来说,用户以及权限管理非常重要,让不用的用户具有不同的权限集合,将会显著的避免误操作。本章内容将会介绍 PostgreSQL 中的用户和权限管理机制。

用户和角色

通常来说,角色是一系列权限的集合,在 PostgreSQL中,我们可以认为一个用户就是一个角色,也就是说,我们可以将一个用户的权限赋予给另外一个用户。

用户管理

1.创建用户

rudonx=# create user rudonx1 password 'ASDFasdf=2020';
CREATE ROLE

2.修改用户,这里以修改密码举例

rudonx=# alter user rudonx1 with password 'QWERqwer=2020';
ALTER ROLE

3.删除用户

rudonx=# drop user rudonx1;
DROP ROLE

需要注意的是,在删除用户时必须要保证所有对象的所有者非删除的用户,否则会有如下报错:

rudonx=# drop user rudonx1;
ERROR:  role "rudonx1" cannot be dropped because some objects depend on it
DETAIL:  1 object in database rudonx1

同时,如果我们之前赋予过一些权限给这个用户,在删除的时候,也会有如下报错:

rudonx1=# drop user rudonx1;
ERROR:  role "rudonx1" cannot be dropped because some objects depend on it
DETAIL:  privileges for database rudonx
```
`
总结来说,需要注意如下几点:

1. 删除用户之前,需要预先删除依赖该用户的对象和权限。
2. 只有具有 create role 权限的用户才能删除非超级用户。

关于用户管理的更多信息,您可以参考文档[1]。
# 权限管理
PostgreSQL 的权限是从如下几个层次来进行划分的:

1. 创建数据库的权限和特殊的超级用户权限( RDS for PostgreSQL 未向用户开放超级管理员权限)
2. 数据库中 schema 的权限,如创建 schema 等操作
3. schema 中对象的权限,比如创建表等操作
4. 其次是表级别权限,如 增删改查
5. 最后是表中某些字段的权限

下面我们通过具体的示例进行展示:
1.向用户添加创建 schema 的权限,表明用户可以在 rudonx 这个 database 中 进行创建 schema 的操作:
```sql
rudonx=# grant create  on database rudonx to rudonx1;
GRANT
```

2.向用户赋予创建表的权限,表明用户可以在 public schema 中创建表,这里需要使用 grant 语法[2]:
```sql
rudonx=# grant create on schema public to rudonx1;
GRANT
```

3.赋予用户查询 owner 为其他用户的表的权限
```sql
rudonx=# grant select on table test to rudonx1;
GRANT
```

如果想赋予 public 下所有表的查询权限,可以使用如下语句:
```sql
rudonx=# grant select on all tables in schema public to rudonx1;
GRANT
```

4.查看特定用户所具有的表级权限
````undefined
rudonx=# select table_catalog,table_schema,table_name , privilege_type from information_schema.table_privileges where grantee='rudonx1';
 table_catalog | table_schema | table_name | privilege_type 
---------------+--------------+------------+----------------
 rudonx        | public       | rudonx     | SELECT
 rudonx        | public       | test1      | SELECT
 rudonx        | public       | test       | SELECT
 rudonx        | public       | t1         | SELECT
(4 rows)
```
`
5.查看用户具有的 schema 级别的权限
```sql
rudonx=# SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner",
  pg_catalog.array_to_string(n.nspacl, E'\n') AS "Access privileges",
  pg_catalog.obj_description(n.oid, 'pg_namespace') AS "Description"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;
  Name   |  Owner  | Access privileges |      Description       
---------+---------+-------------------+------------------------
 public  | rudonx  | rudonx=UC/rudonx +| standard public schema
         |         | =UC/rudonx       +| 
         |         | rudonx1=C/rudonx  | 
 rudonx1 | rudonx1 |                   | 
(2 rows)
```

6.查看用户具有的数据库级别的权限
```sql
rudonx=# SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges",
       CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
            THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
            ELSE 'No Access'
       END as "Size",
       t.spcname as "Tablespace",
       pg_catalog.shobj_description(d.oid, 'pg_database') as "Description"
FROM pg_catalog.pg_database d
  JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid
ORDER BY 1;

输出如下:
-[ RECORD 2 ]-----+-------------------------------------------
Name              | rudonx
Owner             | rudonx
Encoding          | UTF8
Collate           | en_US.utf-8
Ctype             | en_US.utf-8
Access privileges | =Tc/rudonx                                +
                  | rudonx=CTc/rudonx                         +
                  | rudonx1=C/rudonx
Size              | 8261 kB
Tablespace        | pg_default
Description       | 
```

7.最后让我们来看下如何回收权限,回收权限使用 revoke 语法[3]:
```sql
rudonx=# revoke select on table test1 from rudonx1;
REVOKE
```

对于 grant 和 revoke 来说,简单的可以简化为如下两个命令:
```sql
GRANT some_privileges ON database_object_type object_name TO role_name;

REVOKE some_privileges ON database_object_type object_name FROM role_name;
```

# 参考文档
[1] [https://www.postgresql.org/docs/11/sql-createuser.html](https://www.postgresql.org/docs/11/sql-createuser.html)
[2][https://www.postgresql.org/docs/11/sql-grant.html](https://www.postgresql.org/docs/11/sql-grant.html)
[3] [https://www.postgresql.org/docs/11/sql-revoke.html](https://www.postgresql.org/docs/11/sql-revoke.html)
**如果您有其他问题,欢迎您联系火山引擎**[技术支持服务](https://console.volcengine.com/ticket/createTicketV2/)

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论