一、用户和角色

什么是角色?

角色是一系列相关权限的集合。为了管理方便,通常把一系列相关的数据库权限赋给一个角色,如果哪个用户 需要这些权限,就把角色赋给相应的用户。由于用户也拥有一系列的相关权限

在PostgreSQL中,为了简化管理角色与用户是没有区别的,一个用户也是一个角色,我们可以把一个用户的 权限赋给另一个用户

用户和角色在整个数据库实例中是全局的,在同一个实例中的不同数据库中,看到的用户都是相同的。 超级用户-初始化该数据库的操作系统用户名相同

如果数据库是建在操作系统用户“postgres”(通常我们把数据库安装在此用户下)下的,那么这个数据库超级 用户的名称也叫“postgres”

在超级用户下创建更多的普通用户

二、创建用户和角色

语法:

CREATE ROLE name [ [ WITH ] option [ ... ] ] CREATE USER name [ [ WITH ] option [ ... ] ]

option取值介绍:

SUPERUSER | NOSUPERUSER    : 是否为超级用户(最高权限)
CREATEDB   | NOCREATEDB     : 是否允许创建数据库
CREATEROLE | NOCREATEROLE   : 是否允许创建角色
CREATEUSER | NOCREATEUSER   : 是否允许创建用户(已废弃,等同 SUPERUSER
LOGIN      | NOLOGIN        : 是否允许登录数据库
INHERIT    | NOINHERIT      : 是否继承角色权限
REPLICATION | NOREPLICATION : 是否允许流复制、备份权限
CONNECTION LIMIT             : 最大连接数
PASSWORD                     : 设置密码
VALID UNTIL                  : 密码过期时间

三、权限的管理

用户的权限分为两类,一类是在创建用户时就指定的权限,有如下几种:

  • 超级用户的权限
  • 创建数据库的权限
  • 是否允许LOGIN的权限

另一类权限是由GRANT命令和REVOKE命令来管理的,有如下几种

  • 在数据库中创建模式(SCHEMA)。
  • 允许在指定的数据库中创建临时表的权限。
  • 连接某个数据库的权限。 ·在模式中创建数据库对象的权限,如创建表、视图、函数等。
  • 在一些表中做SELECT、UPDATE、INSERT、DELETE等操作的权限。
  • 在一张具体的表的列上进行SELECT、UPDATE、INSERT操作的权限
  • 在声明表上创建触发器的权限。
  • 把表、索引等建到指定表空间的权限

在使用时要分清上述两类权限,如果要给用户赋予创建数据库的权限,需要使用ALTER ROLE命令,而要给用 户赋予创建模式的权限时,则需要使用GRANT命令

postgresql中需要注意:

PostgreSQL没有专门的DDL语句的权限,

能否创建表,是看在模式(SCEHME)中是否有CREATE的权限

四、函数和触发器的权限

为了加强安全性,PostgreSQL只允许超级用户使用这样的 PL语言写函数。

五、权限的总结

PostgreSQL中的权限是按以下几个层次进行管理的

1、首先管理赋在用户特殊属性上的权限,如超级用户的权限、创建数据库的权限、创建用户的权限、LOGIN权限,等等。

2、然后是在数据库中创建模式的权限。

3、接着是在模式中创建数据库对象的权限,如创建表、索引等。

4、之后是查询表、向表中插入数据、更新表、删除表中数据的权限。

5、最后是操作表中某些字段的权限。

六、如何创建一个只读用户

第一步:需要执行下面的SQL命令

REVOKE CREATE ON SCHEMA public from public;

这是因为在PostgreSQL中默认任何用户都可以在名为“public”的Schema中创建表,而只读用户是不允许创建 表的,所以先要把此权限给收回。

第二步:创建一个名为“readonly”的用户

CREATE USER readonly with password 'query';

第三步:把public下现有的所有表的SELECT权限赋予用户“readonly”

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly

上面的SQL命令只是把现有表的权限赋予了用户 “readonly”,如果此时创建了表,readonly用户仍不能读。

第四步:需要使用下面的SQL命令把所建表的SELECT 权限也赋予该用户:

ALTER DEFAULT PRIVILEGES IN SCHEMA public grant select on tables to readonly;

注意: 上面的过程只是给名为“public”的Schema下的表赋予了只读权限,如果想让该用户访问其他Schema下的表