CREATE ROLE name;
postgres=# SELECT rolname FROM pg_roles;
rolname
---------------------------
pg_monitor
pg_read_all_settings
pg_read_all_stats
pg_stat_scan_tables
pg_read_server_files
pg_write_server_files
pg_execute_server_program
pg_signal_backend
postgres
monitor_system_stats
(10 rows)
postgres=# \du
List of roles
Role name | Attributes | Member of
----------------------+------------------------------------------------------------+-----------
monitor_system_stats | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
登录特权
只有具有 LOGIN 属性的角色才能连接数据库。具有 LOGIN 角色的用户可以被看做一个“数据库用户”。使用以下语句创建具有登录特权的角色:
CREATE ROLE name LOGIN;
CREATE USER name;
CREATE USER与CREATE ROLE都可以用于创建角色,只不过CREATE USER默认包含了 LOGIN 选项,而CREATE ROLE 没有。
超级用户
数据的超级用户可以避开所有的权限检查,只验证登录权限。因此,这是一个很危险的特权,使用时需要特别小心;最好在日常的操作中避免使用超级用户。使用以下命令创建一个新的超级用户:
CREATE ROLE name SUPERUSER;
只有超级用户才能创建其他的超级用户。
CREATE ROLE name CREATEDB;
创建角色
只有明确授权的角色才能够创建其他角色(超级用户除外,因为他们可以避开权限检查)。使用以下命令创建一个具有角色创建特权的角色:
CREATE ROLE name CREATEROLE;
具有 CREATEROLE 特权的角色还可以修改或删除其他角色,以及为这些角色授予或者撤销成员角色。但是,针对超级用户的创建、修改、删除,以及它的成员变更,需要超级用户特权;CREATEROLE 特权无法针对超级用户执行这些操作。
CREATE ROLE name REPLICATION LOGIN;
密码
只有当用户连接数据库使用的客户端认证方法要求提供密码时,密码属性才有意义。password 和 md5 认证方法需要使用密码。数据库的密码与操作系统的密码相互独立。使用以下语句在创建角色时指定密码:
CREATE ROLE name PASSWORD 'string';
CREATE ROLE tony WITH LOGIN PASSWORD 'Pass2019' VALID UNTIL '2020-01-01';
-- CREATE USER tony WITH PASSWORD 'Pass2019' VALID UNTIL '2020-01-01';
[root@centos7 ~]# psql -h 192.168.56.103 -p 5432 -U tony postgres
Password for user tony:
psql (11.1)
Type "help" for help.
postgres=> \c
You are now connected to database "postgres" as user "tony".
postgres=# CREATE ROLE admin CREATEDB CREATEROLE;
CREATE ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
admin | Create role, Create DB, Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
tony | Password valid until 2020-01-01 00:00:00-05 | {}
postgres=# ALTER ROLE admin NOCREATEROLE;
ALTER ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
admin | Create DB, Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
tony | Password valid until 2020-01-01 00:00:00-05 | {}
hrdb=> SELECT * FROM employees;
ERROR: permission denied for table employees
GRANT privilege_list | ALL
ON [ TABLE ] table_name
TO role_name;
hrdb=# GRANT SELECT, INSERT, UPDATE, DELETE
hrdb-# ON employees, departments, jobs
hrdb-# TO tony;
GRANT
hrdb=> SELECT * FROM employees;
employee_id | first_name | last_name | email | phone_number | hire_date | job_id | salary | commission_p
ct | manager_id | department_id
-------------+-------------+-------------+----------+--------------------+------------+------------+----------+-------------
---+------------+---------------
100 | Steven | King | SKING | 515.123.4567 | 2003-06-17 | AD_PRES | 24000.00 |
| | 90
101 | Neena | Kochhar | NKOCHHAR | 515.123.4568 | 2005-09-21 | AD_VP | 17000.00 |
| 100 | 90
102 | Lex | De Haan | LDEHAAN | 515.123.4569 | 2001-01-13 | AD_VP | 17000.00 |
| 100 | 90
...
GRANT privilege_list | ALL
ON ALL TABLES IN SCHEMA schema_name
TO role_name;
hrdb=# GRANT SELECT
hrdb-# ON ALL TABLES IN SCHEMA public
hrdb-# TO tony;
GRANT
hrdb=# GRANT SELECT, INSERT, UPDATE, DELETE
hrdb-# ON employees, departments, jobs
hrdb-# TO tony WITH GRANT OPTION;
REVOKE privilege_list | ALL
ON TABLE table_name
FROM role_name;
hrdb=# REVOKE SELECT, INSERT, UPDATE, DELETE
hrdb-# ON employees, departments, jobs
hrdb-# FROM tony;
REVOKE
REVOKE privilege_list | ALL
ON ALL TABLES IN SCHEMA schema_name
FROM role_name;
hrdb=# REVOKE SELECT
hrdb-# ON ALL TABLES IN SCHEMA public
hrdb-# FROM tony;
REVOKE
CREATE ROLE group_name;
CREATE ROLE managers;
GRANT group_name TO user_role, ... ;
REVOKE group_name FROM user_role, ... ;
postgres=# GRANT managers TO tony;
GRANT ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+------------
admin | Create DB, Cannot login | {}
managers | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
tony | Password valid until 2020-01-01 00:00:00-05 | {managers}
postgres=# GRANT admin TO managers;
GRANT ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+------------
admin | Create DB, Cannot login | {}
managers | Cannot login | {admin}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
tony | Password valid until 2020-01-01 00:00:00-05 | {managers}
postgres=# GRANT managers TO admin;
ERROR: role "managers" is a member of role "admin"
首先,组中的成员可以通过SET ROLE命令将自己的角色临时性“变成”该组角色。此时,当前数据库会话拥有该组角色的权限,而不是登录用户的权限;并且会话创建的任何数据库对象归组角色所有,而不是登录用户所有。
其次,对于具有 INHERIT 属性的角色,将会自动继承它所属的组的全部特权,包括这些组通过继承获得的特权。
CREATE ROLE user1 LOGIN INHERIT;
CREATE ROLE net_admins NOINHERIT;
CREATE ROLE sys_admins NOINHERIT;
GRANT net_admins TO user1;
GRANT sys_admins TO net_admins;
SET ROLE net_admins;
SET ROLE sys_admins;
SET ROLE user1;
SET ROLE NONE;
RESET ROLE;
ALTER ROLE net_admins CREATEDB, CREATEROLE;
SET ROLE net_admins;
DROP ROLE name;
postgres=# drop role admin;
DROP ROLE
原文作者:SQL编程思想;如有侵权,请联系管理员删除。