Whoami:5年+金融、政府、医疗领域工作经验的DBACertificate:OCP、PCPSkill:Oracle、Mysql、PostgreSQLPlatform:CSDN、墨天伦、公众号(呆呆的私房菜)
阅读本文可以了解到PostgreSQL用户与角色相关的内容,包括概念、权限管理等内容。
数据库用户和操作系统用户不同,但是可以通过文件做映射。
Postgre用户分为普通用户和普通用户。
PostgreSQL通过role来管理数据库访问权限,role是一系列相关权限的集合。
role在整个集簇是全局性的,即同个集簇里边的不同database,看到的用户是相同的。
用户:拥有login登录数据库权限的role
角色:可以拥有数据库对象、如表、索引、也可以把这些对象上的权限赋予其他角色,以控制哪些用户对哪些对象拥有哪些权限。
组:不拥有replication、noreplication、connection limit属性的role。
注意:PostgreSQL8.1之前,user与group是不同类型的实体,现在可以看作是role,任意一个role均可以自由地在user和group之间转换。
1. 创建用户、角色
## 1. 系统命令行创建createuser username with option xxx;## 2. 在psql命令行创建用户create user username with option xxx;option可以是:SUPERUSER | NOSUPERUSER| CREATEDB | NOCREATEDB| CREATEROLE | NOCREATEROLE| CREATEUSER | NOCREATEUSER| INHERIT | NOINHERIT #角色是其他角色的成员,这些子句决定新角色是否从那些角色中“继承”特权| LOGIN | NOLOGIN| REPLICATION | NOREPLICATION| BYPASSRLS | NOBYPASSRLS #决定是否一个角色可以绕过每一条行级安全性(RLS)策略。| CONNECTION LIMIT connlimit| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...]| IN GROUP role_name [, ...]| ROLE role_name [, ...]| ADMIN role_name [, ...] #ADMIN子句与ROLE相似,让它们能够把这个角色中的成员关系授予给其他人。| USER role_name [, ...]| SYSID uid## 在psql命令行创建角色create role rolename with option xxx;option可以是:SUPERUSER | NOSUPERUSER| CREATEDB | NOCREATEDB| CREATEROLE | NOCREATEROLE| CREATEUSER | NOCREATEUSER| INHERIT | NOINHERIT| LOGIN | NOLOGIN| REPLICATION | NOREPLICATION| CONNECTION LIMIT connlimit| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...]| IN GROUP role_name [, ...]| ROLE role_name [, ...]| ADMIN role_name [, ...]| USER role_name [, ...]| SYSID uid
| 基本•语法 | 支持参数 | 参数含义 |
| create user UserName | superuser nosuperuser | 该用户是否为超级用户,缺省否 |
| createdb nocreatedb | 该用户是否能创建数据库,缺省不能 | |
| createrole nocreaterole | 该用户是否能创建新角色,缺省不能 | |
| createuser nocreateuser | 该用户是否能创建新用户,缺省不能 | |
| inherit noinherit | 该用户是否集成父角色的权限,缺省不能 | |
| login nologin | 该用户是否能登陆数据库,缺省能 | |
| replication noreplication | 该用户是否能作为流复制用户,缺省不能 | |
| bypassrls nobypassrls | 该用户能否绕过行级安全策略,缺省否 | |
| connection limit | 该用户的最大并发连接数,缺省-1无限制 | |
| [encrypted noencrypted] password 'passwords' | 该用户的密码,及是否加密存储在系统表里 | |
| valid until | 该用户的密码失效时间 | |
| in role | 该用户所属的父角色 | |
| in group | 同in role,但属于过去式语法 | |
| role | 该用户作为角色时,所拥有的子成员 | |
| admin | 同role,但具有with admin option权限 | |
| user | 同role,但术语过去式语法 | |
| sysid UID | 该选项主要是为了向下兼容 |
2. 查看用户、角色
## 显示用户和角色属性\dupostgres=# \d pg_rolesView "pg_catalog.pg_roles"Column | Type | Collation | Nullable | Default----------------+--------------------------+-----------+----------+---------rolname | name | | |rolsuper | boolean | | |rolinherit | boolean | | |rolcreaterole | boolean | | |rolcreatedb | boolean | | |rolcanlogin | boolean | | |rolreplication | boolean | | |rolconnlimit | integer | | |rolpassword | text | | |rolvaliduntil | timestamp with time zone | | |rolbypassrls | boolean | | |rolconfig | text[] | C | |oid | oid | | |postgres=# \d pg_userView "pg_catalog.pg_user"Column | Type | Collation | Nullable | Default--------------+--------------------------+-----------+----------+---------usename | name | | |usesysid | oid | | |usecreatedb | boolean | | |usesuper | boolean | | |userepl | boolean | | |usebypassrls | boolean | | |passwd | text | | |valuntil | timestamp with time zone | | |useconfig | text[] | C | |
3. 修改用户、角色
## 修改用户、角色属性alter role username with option;## 重命名alter user oldname rename to newname;## 设置用户参数alter user username set parametername to value;## 重置配置参数alter user username reset parametername all;
4. 删除用户、角色
## 1. 系统命令行删除dropuser username## 2.在psql命令行删除drop user username;drop role rolename;drop role if exists role_name;## 注意:## 1、只用超级用户能够删除超级用户## 2、只有具有createrole权限的用户能删除非超级用户## 3、删除用户前,需要先删除依赖该用户的对象、权限等信息## 4、任何属于该组角色的对象都必须先被删除或者将对象的所有者赋予其它角色,任何赋予该组角色的权限也都必须被撤消。## 5、删除组role只会删除组的role本身,组的成员并不会被删除
5. 预定义角色
角色 描述 pg_read_all_data 读取所有数据(表、视图、序列),拥有对象SELECT权限,对所有架构拥有USAGE权限一样,即使没有明确的权限。此角色没有设置角色属性BYPASSRLS。如果正在使用RLS,管理员可能希望在授予此角色的角色上设置BYPASSRLS。 pg_write_all_data 写入所有数据(表、视图、序列),就好像对这些对象具有INSERT、UPDATE和DELETE权限,对所有架构具有USAGE权限一样,即使没有明确的权限。此角色没有设置角色属性BYPASSRLS。如果正在使用RLS,管理员可能希望在授予此角色的角色上设置BYPASSRLS。 pg_read_all_settings 读取所有配置变量,即使是那些通常只对超级用户可见的变量。 pg_read_all_stats 读取所有pg_stat_*视图并使用各种与统计信息相关的扩展,即使是那些通常只对超级用户可见的扩展。 pg_stat_scan_tables 执行监视函数,这些函数可能会在很长一段时间内对表使用ACCESS SHARE锁。 pg_monitor 读取/执行各种监视视图和功能。此角色是pg_read_all_settings、pg_read_all_stats和pg_stat_scan_tables的成员。 pg_database_owner 无。成员身份隐含地由当前数据库所有者组成。 pg_signal_backend 用信号通知另一个后端取消查询或终止其会话。 pg_read_server_files 允许使用COPY和其他文件访问功能从数据库可以访问的服务器上的任何位置读取文件。 pg_write_server_files 允许使用COPY和其他文件访问功能写入数据库可以在服务器上访问的任何位置的文件。 pg_execute_server_program 允许以用户身份在数据库服务器上执行程序数据库与COPY和其他允许执行服务器端程序的功能一样运行。 pg_checkpoint 允许执行checkpoint命令。 pg_use_reserved_connections 允许使用通过reserved_connections保留的连接插槽。 pg_create_subscription 允许对数据库具有create权限的用户发出create subscription。
任何数据库对象都有一个所有者,默认情况下,所有者拥有该对象的所有权限。
数据库中所有权限都和角色挂钩,PostgreSQL权限分为系统权限和对象权限。

1. 实例权限
## 配置pg_hba.conf限制用户登录cat $PGDATA/pg_hba.conf# TYPE DATABASE USER ADDRESS METHOD# "local" is for Unix domain socket connections onlylocal all all trust# IPv4 local connections:host all all 127.0.0.1/32 trust# IPv6 local connections:host all all ::1/128 trust# Allow replication connections from localhost, by a user with the# replication privilege.local replication all trusthost replication all 127.0.0.1/32 trusthost replication all ::1/128 trust
2. 数据库权限
| 特权 | 描述 |
| connect | 允许用户连接到特定的数据库 |
| create | 授予在数据库创建新对象的能力 |
| temporary | 允许创建临时表 |
默认情况下,CONNECT权限被授予PUBLIC角色(所有用户)。但是,不可能直接从单个用户撤销此权限。相反,您需要从PUBLIC角色中撤销它,然后将它单独授予其他需要它的用户。
revoke connect on database dbname from public;
3. schema权限
PostgreSQL数据库可以由一个或多个模式组成,其中包含表和其他对象,如视图、数据类型、函数、过程和运算符。
不同的模式可以具有相同名称的对象,而不会发生冲突。例如,schema1和schema2都可以包含名为table1的表。
与数据库不同,模式不是严格分开的。用户可以访问他们所连接的数据库中任何模式中的对象,前提是他们拥有必要的权限。
grant usage on schema schemaname to username;grant create on schema schemaname to username;grant all on schema schemaname to username;
4. object权限
| 权限 | 描述 |
| select | 允许从表中提取数据 |
| insert | 允许向表中添加新行 |
| update | 修改表中的现有行 |
| delete | 授予从表中删除行的功能 |
| references | 允许创建外键约束 |
| trigger | 允许在表上创建触发器 |
| truncate | 允许在表上使用truncate |
## 授予增删改权限grant insert,update,delete on table tablename to username;## 授予单个表上的所有权限grant all on table tablename to username;## 授权schema上所有表的所有权限grant all on all tables in schema schemaname to username;
关于授权的语法格式如下:
postgres=# \h grantCommand: GRANTDescription: define access privilegesSyntax:GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }[, ...] | ALL [ PRIVILEGES ] }ON { [ TABLE ] table_name [, ...]| ALL TABLES IN SCHEMA schema_name [, ...] }TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }ON [ TABLE ] table_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { { USAGE | SELECT | UPDATE }[, ...] | ALL [ PRIVILEGES ] }ON { SEQUENCE sequence_name [, ...]| ALL SEQUENCES IN SCHEMA schema_name [, ...] }TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }ON DATABASE database_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { USAGE | ALL [ PRIVILEGES ] }ON DOMAIN domain_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { USAGE | ALL [ PRIVILEGES ] }ON FOREIGN DATA WRAPPER fdw_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { USAGE | ALL [ PRIVILEGES ] }ON FOREIGN SERVER server_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ]GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }ON LARGE OBJECT loid [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }ON SCHEMA schema_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { CREATE | ALL [ PRIVILEGES ] }ON TABLESPACE tablespace_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT { USAGE | ALL [ PRIVILEGES ] }ON TYPE type_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]GRANT role_name [, ...] TO role_specification [, ...][ WITH ADMIN OPTION ][ GRANTED BY role_specification ]where role_specification can be:[ GROUP ] role_name| PUBLIC| CURRENT_ROLE| CURRENT_USER| SESSION_USER
本文内容就到这啦,阅读完本篇,相信你对PostgreSQL的用户、角色以及权限相关的配置有了一个大概的掌握了吧!记得有空的时候多做做练习哦!我们下篇再见!





