文章目录
- 52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色
- 52.1 创建角色
- 创建角色示例
- 52.2 查看角色
- 查看角色示例
- 52.3 修改角色
- 52.3.1 修改用户名
- 52.3.2 修改用户示例
- 52.3.3 修改用户密码
- 52.3.4 修改角色密码示例
- 52.4 删除角色
- 删除角色示例
- 52.5 角色授权
- 角色授权示例
- 52.6 删除用户权限
- 删除用户权限示例
52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色
52.1 创建角色
可以使用CREATE ROLE语句或createuser来创建角色。createuser是对CREATE ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
CREATE ROLE rolename [ [ WITH ] option [ ... ] ];
createuser rolename
其中:
- rolename:角色名。
- option为参数选项,常用的有:
- SUPERUSER | NOSUPERUSER:决定一个新角色是否为"超级用户",若未指定,则默认为NOSUPERUSER,即不是超级用户。
- CREATEDB | NOCREATEDB:定义一个角色是否能创建数据库,若未指定,则默认为NOCREATEDB,即不能创建数据库。
- CREATEROLE | NOCREATEROLE:决定一个角色是否可以创建新角色,若未指定,则默认为NOCREATEROLE,即不能创建新角色。
- INHERIT | NOINHERIT:决定一个角色是否"继承"它所在组的角色的权限。一个带有 INHERIT 属性的角色可以自动使用已经赋与它直接或间接所在组的任何权限。若未指定,则默认为INHERIT。
- LOGIN | NOLOGIN:决定一个角色是否可以登录,一个拥有LOGIN属性的角色可以认为是一个用户,若无此属性的角色可以用于管理数据库权限,但是并不是用户,若未指定,则默认为NOLOGIN。但若创建角色是使用的是CREATE USER而不是CREATE ROLE,则默认是LOGIN属性。
- [ ENCRYPTED | UNENCRYPTED ] PASSWORD ‘password’:设置角色的密码,密码只对那些拥有 LOGIN 属性的角色有意义。ENCRYPTED | UNENCRYPTED表示是否对密码进行加密,若未指定,则默认为ENCRYPTED,即加密。
- VALID UNTIL ‘timestamp’:角色的密码失效的时间戳,若为指定,则表示密码永久有效。
- IN ROLE rolename1:列出一个或多个现有的角色,新角色rolename将立即加入这些角色,成为rolename1的成员。
- ROLE rolename2:列出一个或多个现有的角色,它们将自动添加为新角色rolename的成员,即新角色为"组"。
要使用这条命令,必须拥有 CREATEROLE 权限或者是数据库超级用户。
创建角色示例
创建一个可以登录的角色roletest1。
postgres=# CREATE ROLE roletest1 LOGIN;
CREATE ROLE
postgres=#
创建一个密码为123456的角色roletest2。
postgres=# CREATE ROLE roletest2 WITH LOGIN PASSWORD '123456';
CREATE ROLE
postgres=#
创建角色名为roletest3的角色。。
[postgres@superman-21 ~]$ createuser roletest3
[postgres@superman-21 ~]$
52.2 查看角色
可以使用SELECT语句或psql的元命令\du查看角色。
SELECT rolename FROM pg_roles;
\du
其中:rolename:角色名。
查看角色示例
查看所有角色名。
postgres=# SELECT rolname from pg_roles;
rolname
---------------------------
pg_monitor
pg_read_all_settings
pg_read_all_stats
pg_stat_scan_tables
pg_read_server_files
pg_write_server_files
pg_execute_server_program
pg_signal_backend
postgres
roletest1
roletest2
roletest3
(12 行记录)
postgres=#
查看现有角色。
postgres=# \du
角色列表
角色名称 | 属性 | 成员属于
-----------+--------------------------------------------+----------
postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
roletest1 | | {}
roletest2 | | {}
roletest3 | | {}
postgres=#
52.3 修改角色
52.3.1 修改用户名
可以使用ALTER ROLE语句修改一个已经存在的角色名。
ALTER ROLE oldrolername RENAME TO newrolename;
其中:
- oldrolername:旧的角色名。
- newrolename:新的角色名。
52.3.2 修改用户示例
将角色名roletest1修改为roletest4。
postgres=# ALTER ROLE roletest1 RENAME TO roletest4;
ALTER ROLE
postgres=#
52.3.3 修改用户密码
可以使用ALTER ROLE语句修改一个角色的登录密码。
ALTER ROLE rolename PASSWORD 'password'
其中:
- rolename:角色名。
- password:密码。
52.3.4 修改角色密码示例
将roletest2的密码修改为456789。
postgres=# ALTER ROLE roletest2 WITH PASSWORD '456789';
ALTER ROLE
postgres=#
52.4 删除角色
可以使用DROP ROLE语句或dropuser来删除角色。dropuser是对DROP ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
DROP ROLE rolename;
dropuser rolename
其中:rolename:角色名。
删除角色示例
删除roletest2角色。
postgres=# DROP ROLE roletest2;
DROP ROLE
postgres=#
删除roletest3角色。。
[postgres@superman-21 ~]$ dropuser roletest3
[postgres@superman-21 ~]$
52.5 角色授权
可以使用GRANT语句来对角色授权。
对角色授予表的操作权限:
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予序列的操作权限:
GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予数据库的操作权限:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予函数的操作权限:
GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予过程语言的操作权限:
GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予模式的操作权限:
GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予表空间的操作权限:
GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
将角色rolename1的成员关系赋予角色rolename2:
GRANT rolename1 [, ...] TO rolename2 [, ...] [ WITH ADMIN OPTION ]
其中:
- SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL [ PRIVILEGES ]:用户的操作权限,ALL [ PRIVILEGES ]表示所有的权限,PRIVILEGES 关键字在 PostgreSQL 里是可选的,但是严格的 SQL 要求有这个关键字。
- ON字句:用于指定权限授予的对象。
- tablename:表名。
- TO字句:用来指定被赋予权限的角色。
- rolename、rolename1、rolename2:角色名。
- groupname:角色组名。
- PUBLIC:表示该权限要赋予所有角色,包括那些以后可能创建的用户。
- WITH GRANT OPTION:表示权限的接收者也可以将此权限赋予他人,否则就不能授权他人。该选项不能赋予给PUBLIC。
- sequencename:序列名。
- databasename:数据库名。
- funcname ( [ [ argmode ] [ argname ] argtype [, …] ] ):函数名及其参数。
- langname:过程语言名。
- schemaname:模式名。
- tablespacename:表空间名。
- WITH ADMIN OPTION:表示成员随后就可以将角色的成员关系赋予其它角色,以及撤销其它角色的成员关系。
角色授权示例
对roletest4授予数据库database1的CREATE权限。
postgres=# GRANT CREATE ON DATABASE postgres TO roletest4;
GRANT
postgres=#
对所有用户授予表t1的所有权限。
postgres=# GRANT ALL PRIVILEGES ON TABLE t1 TO PUBLIC;
GRANT
postgres=#
52.6 删除用户权限
可以使用REVOKE语句来撤销以前赋予一个或多个角色的权限。
撤销角色对表的操作权限:
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...]
撤销角色对序列的操作权限:
REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对数据库的操作权限:
REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对函数的操作权限:
REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对过程语言的操作权限:
REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对模式的操作权限:
REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对表空间的操作权限:
REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
删除rolename2的rolename1的成员关系:
REVOKE [ ADMIN OPTION FOR ] rolename1 [, ...] FROM rolename2 [, ...] [ CASCADE | RESTRICT ]
其中:
- GRANT OPTION FOR:表示只是撤销对该权限的授权的权力,而不是撤销该权限本身。
- SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL [ PRIVILEGES ]:用户的操作权限,ALL [ PRIVILEGES ]表示所有的权限,PRIVILEGES关键字在 PostgreSQL里是可选的,但是严格的SQL 要求有这个关键字。
- ON字句:用于指定撤销权限的对象。
- tablename:表名。
- FROM字句:用来指定被撤销权限的角色。
- rolename、rolename1、rolename2:角色名。
- groupname:角色组名。
- PUBLIC:表示撤销隐含定义的、拥有所有角色的组,但并不意味着所有角色都失去了权限,那些直接得到的权限以及通过一个组得到的权限仍然有效。
- sequencename:序列名。
- CASCADE:撤销所有依赖性权限。
- RESTRICT:不撤销所有依赖性权限。
- databasename:数据库名。
- funcname ( [ [ argmode ] [ argname ] argtype [, …] ] ):函数名及其参数。
- langname:过程语言名。
- schemaname:模式名。
- tablespacename:表空间名。
- ADMIN OPTION FOR:表示传递的授权不会自动收回。
删除用户权限示例
对roletest4授予数据库postgres的CREATE权限。
postgres=# GRANT CREATE ON DATABASE postgres TO roletest4;
GRANT
postgres=#
对所有用户授予表pg_proc的所有权限。
postgres=# GRANT ALL PRIVILEGES ON TABLE pg_proc TO PUBLIC;
GRANT
postgres=#
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!