目录
一、用户与角色的定义
1、用户与角色数据库用户用来访问、管理数据库中的对象(表、索引.)
2、数据库角色用来管理数据库访问权限,简化权限的管理。在PG中,用户也可以实现这个功能。
3、用户和角色在整个数据库集簇中是全局性的,不是针对某个单一数据库,只要有足够的权限,用户可以访问所有数据库的对象。
4、数据库用户可以分为两类:
超级用户-- postgres
普通用户--根据需要创建
二、用户与角色的区别
1、user:默认拥有 login登陆数据库权限的role
2、role:可以拥有数据库对象,如表、索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限。
3、group:不拥有 replication/ nonreplication、 connection limit属性的role
4、在PG8.1之前,user与group是不同类型的实体,现在可以被看作是role,任意一个role均可自由的在user与 group间转换
三、管理用户与角色(SQL)
快速查看当前所有用户:\du
查看详细用户信息:select * from pg_user;
查看详细角色信息:select * from pg_roles;
查看当前登录用户:select user;
创建用户:CREATE USER $user_name PASSWORD '$password';
创建角色:CREATE ROLE $role_name;
修改用户与角色:ALTER USER[ROLE] $user_name
e.g.
//修改用户名:ALTER USER U2 RENAME TO U22;
//修改用户的密码:ALTER USER U22 PASSWORD'U22;
//修改用户的权限:ALTER USER u22 CREATEROLE;
//修改数据库 testdb中的参数重设为默认值:ALTER USER u22 IN DATABASE testdb RESET all1;
//修改角色的名字:ALTER ROLE dev RENAME TO dev1;
//修改角色的权限:ALTER ROLE dev1 SUPERUSER;
//修改角色的权限:ALTER ROLE dev1 LOGIN;
删除用户与角色:DROP USER[ROLE] [IF EXISTS] $user_name
授权用户某个角色:GRANT $role_name TO $user_name; (授权后set role $role_name启用生效)
四、小实验
当使用用户wqdb登录数据库、启用角色dbcreate权限之后,使用该权限操作的对象,都会属于该角色而非用户。且此时登录的user也会变为角色名而非用户名。
//1、打开窗口1,使用已有用户wqdb来测试(wqdb没有create database权限)
-bash-4.2$ psql -U wqdb -h 192.168.0.45
wqdb=> create database test1;
错误: 创建数据库权限不够
wqdb=> select user;
user
------
wqdb
(1 行记录)
//2、打开新窗口2,使用超级管理员用户,创建角色dbcreate,并授权给wqdb
postgres=# create role dbcreate with createdb;
CREATE ROLE
postgres=# \du
角色列表
角色名称 | 属性 | 成员属于
-------------+--------------------------------------------+----------
dbcreate | 建立 DB, 无法登录 | {}
pgloader_pg | | {}
postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
wqdb | | {}
postgres=# grant dbcreate to wqdb;
postgres=# \du
角色列表
角色名称 | 属性 | 成员属于
-------------+--------------------------------------------+------------
dbcreate | 建立 DB, 无法登录 | {}
pgloader_pg | | {}
postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
wqdb | | {dbcreate}
//回到窗口1,启用角色并创建数据库
wqdb=> set role dbcreate;
SET
wqdb=> create database test1;
CREATE DATABASE
wqdb=> \l
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限
--------------+----------+----------+-------------+-------------+------------------------
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
test1 | dbcreate | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
wqdb | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres +
| | | | | wqdb=C/postgres
(6 行记录)
wqdb=> select user;
user
----------
dbcreate
(1 行记录)
做完实验后可以看到,新建的test1数据库的拥有者是角色dbcreate而非用户wqdb。并且窗口1的当前登录用户也从用户wqdb变更了角色dbcreate。
pg从某种程度而言,模糊了角色和用户的概念,在pg中,角色也可以登录、拥有对象。