作者:瀚高PG实验室 (Highgo PG Lab)- Kalath
PostgreSQL使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组。角色可以拥有数据库对象(例如,表和函数)并且能够把那些对象上的权限赋予给其他角色来控制谁能访问哪些对象。此外,还可以把一个角色中的成员资格授予给另一个角色,这样允许成员角色使用被赋予给另一个角色的权限。
数据库角色
数据库角色在概念上已经完全与操作系统用户独立开来。数据库角色在一个数据库集簇安装范围内是全局的。要创建一个角色,可使用CREATE ROLE 命令:
CREATE ROLE role_name;
要移除一个已有的角色,使用相似的DROP ROLE命令:
DROP ROLE role_name;
为了方便,createuser和dropuser作为这些 SQL 命令的包装器,它们可以从 shell 命令行调用:
createuser user_name
dropuser user_name
要决定现有角色的集合,可以检查pg_roles系统目录,例如:
SELECT rolname FROM pg_roles;
psql程序的\du命令也可以用来列出现有角色。
为了引导数据库系统,一个刚刚被初始化好的系统总是包含一个预定义角色。这个角色总是一个超级用户,并且默认情况下(除非在运行initdb时修改)它的名字和初始化数据库集簇的操作系统用户相同。习惯上,这个角色将被命名为postgres。每一个到数据库服务器的连接都是使用某个特定角色名建立的,并且这个角色决定发起连接的命令的初始访问权限。
角色属性
只有具有LOGIN属性的角色才能被用于一个数据库连接的初始角色名称。一个带有LOGIN属性的角色可以被认为和一个“数据库用户”相同。要创建一个带有登录权限的角色,使用以下两者之一:
CREATE ROLE name LOGIN;
CREATE USER name;
CREATE USER默认有LOGIN权限,而CREATE ROLE则没有。一个数据库超级用户会绕开所有权限检查,所以最好用一个不是超级用户的角色来完成你的大部分工作。一个角色必须被显式给予权限才能创建数据库(除了超级用户)。要创建这样一个角色,使用以下命令:
CREATE ROLE role_name CREATEDB
一个角色必须被显式给予权限才能创建更多角色(除了超级用户)。要创建这样一个角色,使用以下命令:
CREATE ROLE role_name CREATEROLE
一个带有CREATEROLE权限的角色也可以修改和删除其他角色,还可以授予或回收角色中的成员关系。然而要创建、修改、删除或修改一个超级用户角色的成员关系,需要以超级用户的身份操作。一个角色必须被显式给予权限才能发起流复制(除了超级用户)。一个被用于流复制的角色必须也具有LOGIN权限。要创建这样一个角色,使用以下命令:
CREATE ROLE role_name REPLICATION LOGIN
在角色创建时指定一个口令,可以使用以下命令:
CREATE ROLE role_name PASSWORD 'postgres'
在创建后可以用ALTER ROLE修改一个角色属性。建议创建一个具有CREATEDB和CREATEROLE权限的角色,而不是创建一个超级用户,并且然后用这个角色来完成对数据库和角色的例行管理。
删除角色
由于角色可以拥有数据库对象并且能持有访问其他对象的特权,删除一个角色常常并非执行一次DROP ROLE命令就能解决。任何被该用户所拥有的对象必须首先被删除或者转移给其他拥有者,并且任何已被授予给该角色的权限必须被收回。
一旦任何有价值的对象已经被转移给新的拥有者,任何由被删除角色拥有的剩余对象就可以用DROP OWNED命令删除。由于这个命令不能访问其他数据库中的对象,有必要在每一个包含该角色所拥有对象的数据库中运行该命令。而且DROP OWNED将不会删除整个数据库或者表空间, 因此如果该角色拥有任何还没有被转移给新拥有者的数据库或者表空间,有必要手工删除它们。
默认角色
PostgreSQL提供一组默认角色, 他们可以访问特定的、通常需要的特权功能和信息。 管理员可以将这些角色 GRANT给用户和/或其环境中的其他角色, 为这些用户提供对指定功能和信息的访问权限。
管理员可以使用GRANT命令给这些用户授予访问权限,例如:
GRANT pg_signal_backend TO admin_user;