> 文章列表 > 52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色

52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色

52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色

文章目录

    • 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_monitorpg_read_all_settingspg_read_all_statspg_stat_scan_tablespg_read_server_filespg_write_server_filespg_execute_server_programpg_signal_backendpostgresroletest1roletest2roletest3
(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=# 

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

在这里插入图片描述