PostgreSQL用户管理
一、组角色管理
1.1、创建组角色
一个组角色可以看作是一组数据库用户。组角色可以拥有数据库对象(比如表),以及可以把这些对象上的权限赋予其他角色,以控制谁拥有访问哪些对象的权限。
sql
-- 语法
CREATE ROLE name;
-- name为组角色名称
sql
-- 创建一个名称为post2的组角色
create role post2;

1.2、查看和修改组角色
角色存储在pg_roles
系统表中,用户可以通过查看此表来查看系统中的角色。
sql
-- 查看系统中的组角色
select rolname from pg_roles;

修改组角色的名称,SQL语法格式如下:
sql
ALTER ROLE 组角色名称 RENAME TO 新的组角色名称
sql
-- 修改组角色post2的名称为post3
alter role post2 rename to post3

1.3、删除组角色
sql
-- 语法
DROP ROLE 组角色的名称
sql
-- 删除组角色post3
drop role post3;
二、角色的各种权限
一个数据库角色可以有一系列属性,这些属性定义它的权限,以及与客户认证系统的交互。常见的权限如下。
2.1、LOGIN(登录)
默认情况下,创建的组角色没有登录权限。只有具有LOGN权限的组角色才可以用作数据库连接的初始角色名。一旦组角色拥有了登录权限,即可当作用户名一样来使用。
创建具有登录权限的组角色,SQL语法如下:
sql
CREATE ROLE name LOGIN;
sql
-- 创建组角色post4,此组角色具有登录权限
create role post4 login;

2.2、SUPERUSER(超级用户)
SUPERUSER拥有对数据库操作的最高权限,可以完成对数据库的所有权限检查。为了保证PostgreSQL的安全,建议用户谨慎使用SUPERUSER,不要轻易创建它,最好使用非超级用户完成用户的大多数工作。
创建数据库超级用户,SQL语法如下:
sql
CREATE ROLE name SUPERUSER;
sql
-- 创建组角色post5,此组角色具有超级用户权限
create role post5 superuser;

只有超级用户才有权限创建超级用户
3.3、CREATEDB(创建数据库)
角色要想创建数据库,必须明确给出该权限。当然是除了超级用户以外,因为超级用户己经具有所有的权限。
创建具有创建数据库权限的组角色,SQL语法格式如下:
sql
CREATE ROLE name CREATEDB;
sql
-- 创建组角色post6,此组角色具有创建数据库的权限
create role post6 createdb;

3.4、CREATEROLE(创建角色)
角色要想创建角色,必须明确给出该权限(除了超级用户以外)。一旦角色具有CREATEROLE权限,即可更改和删除其他角色,还可以给其他角色赋予或者撤销成员关系。当然,如果想对超级用户进行操作,仅有此权限还不够,还必须拥有SUPERUSER权限。
创建具有创建角色权限的组角色,SQL语法格式如下:
sql
CREATE ROLE name CREATEROLE;
sql
-- 创建组角色post7,此组角色具有创建数据库的权限
create role post7 createrole;

3.5、口令
在客户认证方法要求与数据库建立连接时,需要口令权限。常见的认证方法包括password
、md5
和crypt
。
创建具有口令权限的组角色,SQL语法格式如下:
sql
CREATE ROLE name 口令认证方法 具体口令
sql
-- 创建组角色post8,此组角色具有口令权限
create role post8 password '123456';
只有在必须使用口令的时候,口令才比较重要。另外数据库口令与操作系统口令是无关的。
三、账户管理
在PostgreSQL中可以管理用户账号,包括创建用户、删除用户、密码管理等内容。PostgreSQL数据库的安全性,需要通过账户管理来保证。
3.1、创建用户
用户是具有登录权限的组角色。
sql
-- 创建普通用户的$QL语法如下:
CREATE USER name
-- 这和下面语句的作用是等价的:
CREATE ROLE name LOGIN
sql
-- 创建用户名称为postgre02,并具有创建数据库和创建角色的权限,同时登录密码为'123456789'
create user postgre02 password '123456789' createdb createrole;

3.2、删除用户
要想别除用户,必须拥有CREATEROLE权限。删除用户的SQL语法如下:
sql
DROP USER user [, user];
-- DROP USER语句用于删除一个或多个PostgreSQL账户。
sql
-- 使用DROP USER删除账户postgre02
drop user postgre02;
3.3、修改用户密码
sql
-- 使用SQL语句修改密码的语法格式如下:
ALTER USER 用户名 口令认证方式 新密码;
sql
-- 将账户postgre(01的密码修改为123123',SQL语句如下:
ALTER USER postgre01 PASSWORD '123123';
-- 命令执行后,即可使用新密码登录PostgreSQL服务器。
四、组角色和用户权限管理
4.1、对组角色授权
sql
-- 用户还可以使用ALTER ROLE对角色进行授权,语法格式如下
ALTER ROLE 角色名 权限1 权限2 ...;
sql
-- 给post1角色添加创建数据表和创建角色的权限
alter role post1 createdb createrole;
4.2、对用户授权
sql
-- 用户还可以使用ALTER USER对用户进行授权,语法格式如下:
ALTER USER 用户名 权限1 权限2 ...;
sql
-- 给postgre01用户添加创建数据表和创建角色的权限
alter user postgre01 createdb createrole;
4.3、收回组角色权限
sql
-- 将post1角色创建数据表和创建角色的权限收回
alter role post1 nocreatedb nocreaterole;
4.4、收回用户权限
sql
-- 将postgre01用户创建数据表和创建角色的权限收回
alter user postgre01 nocreatedb nocreaterole;
五、数据库权限管理
数据库管理员要对所有用户的权限进行合理规划管理。数据库的操作权限主要包括SELECT、INSERT、UPDATE、DELETE、REFERENCES和TRIGGER等。PostgreSQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的各种权限。
5.1、修改数据库的拥有者
在创建对象的时候,它会被赋予一个拥有者。通常拥有者就是执行创建语句的角色,用户可以根据需要修改数据库的拥有者。
sql
-- 语法
ALTER DATABASE 数据库名称 OWNER TO 拥有者名称;
sql
-- 将mytest数据库的拥有者修改为postl
alter database mytest owner to post1;
5.2、增加用户的数据表权限
默认情况下,只有数据库的所有者可以对其中的数据表进行操作。要允许其他用户使用这个数据表,必须赋予相应的权限。
sql
-- GRANT 权限 ON 数据表 TO 用户名称;
sql
-- 其中,ppol是一个现有的数据表,postgres是一个现有的用户,允许postgres更新ppo1数据表,使用下面的语句更新表的权限:
grant update on ppo1 to postgres;
-- 如果将上面的语句修改为:
grant update on ppo1 to public;
-- 则表示将数据表pol的更新权限赋予系统中的所有角色。
-- 如果将上面的语句修改为:
grant all on ppo1 to postgres;
-- 则表示把适用于该对象的所有权限都赋予用户postgres。
5.3、删除用户的数据表权限
sql
-- 语法
REVOKE 权限 ON 数据表 FROM [用户/角色]
sql
-- 撤销用户对特定表的所有权限
REVOKE ALL PRIVILEGES ON TABLE table_name FROM username;
-- 撤销特定权限(如 SELECT、INSERT 等)
REVOKE SELECT, INSERT ON TABLE table_name FROM username;
-- 撤销用户对模式中所有表的权限:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name FROM username;
-- 撤销用户对将来创建的表的默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name
REVOKE ALL PRIVILEGES ON TABLES FROM username;
六、案例
sql
-- 创建一个数据库test01
create database test01;
-- 选择test0l数据库为当前数据库。在该数据库下创建数据表mystudent
create table mystudent(
numb varchar (30) not null,
name varchar (20) not null,
score int not null
);
-- 创建一个新账户,用户名称为admin01,密码为'pw123'
create user admin01 password 'pw123';
-- 创建一个新账户,用户名称为admin02,密码为'pw456'
create user admin02 password 'pw456';
-- 将数据库test0l的所有者修改为admint01
alter database test01 owner to admin01;

sql
-- 允许用户admin02可以对数据表mystudent进行查询、插入和更新操作
grant select, update, insert on mystudent to admin02;
-- 别除admin02的账户信息
drop user admin02;