OpenGauss的用户和角色【华为根技术】

举报
tea_year 发表于 2025/05/15 14:41:02 2025/05/15
711 0 0
【摘要】 OpenGauss的用户和角色openGauss概述openGauss是关系型数据库,采用客户端/服务器,单进程多线程架构;支持单机和一主多备部署方式,同时支持备机可读、双机高可用等特性。openGauss有如下基本功能:1、支持标准SQLopenGauss数据库支持标准的SQL(Structured Query Language,结构化查询语言)。SQL标准是一个国际性的标准,定期会进行更...

openGauss概述


openGauss是关系型数据库,采用客户端/服务器,单进程多线程架构;支持单机和一主多备部署方式,同时支持备机可读、双机高可用等特性。

openGauss有如下基本功能:

1、支持标准SQL
openGauss数据库支持标准的SQL(Structured Query Language,结构化查询语言)。SQL标准是一个国际性的标准,定期会进行更新和演进。SQL标准的定义分成核心特性以及可选特性,绝大部分的数据库都没有100%支撑SQL标准。openGauss数据库支持SQL92/SQL99/SQL2003等,同时支持SQL2011大部分的核心特性,另外还支持部分的可选特性。

2、支持标准开发接口
openGauss数据库提供业界标准的ODBC(Open Database Connectivity,开放式数据库连接)及JDBC(Java Database Connectivity,java数据库连接)接口,保证用户能将业务快速迁移至openGauss。目前支持标准的ODBC3.5及JDBC4.0接口,其中ODBC能够支持CentOS、openEuler、SUSE、Win32、Win64等平台,JDBC无平台差异。

3、混合存储引擎支持
openGauss数据库支持行存储引擎、列存储引擎和内存存储引擎等。行存分为“inplace update” 和 “append update”两种模式,前者通过单独的回滚段(undo log)来保留元组的前像以解决读写冲突,可以更自然的支持数据更新;后者将更新记录混杂在数据记录中,通过新旧版本的形式来支持数据更新,对于旧版本需要定期做vacuum操作来支持磁盘空间的回收。列存支持数据快速分析,更适合OLAP(Online Analytical Processing,联机分析处理)业务。内存引擎支持实时数据处理,对有极致性能要求的业务提供支撑。

4、事务支持
事务支持指的就是系统提供事务的能力,openGauss支持事务的原子性、一致性、隔离性和持久性。事务支持及数据一致性保证是绝大多数数据库的基本功能,只有支持了事务,才能满足事务化的应用需求。

用户和角色管理是数据库管理系统中的重要功能,用于管理数据库中的用户和角色,以控制对数据库的访问权限。用户是数据库中的实体,用于标识和管理数据库中的各种操作权限和资源使用权限。而角色是一组权限的集合,可以将一组用户分配到同一个角色上,从而简化权限管理和控制。

在openGauss数据库中,用户和角色管理可以通过SQL语句或者openGauss控制台来完成。通过创建、修改、删除用户和角色,可以控制用户的身份验证和访问权限。

用户

 使用数据库系统服务的个体 

 职责单一,往往附属于某个组织或部门

用户可以做什么 

 使用工具连接数据库 

 访问数据库对象 

 执行SQL语句

角色

 角色是一组用户的集合,按照数据库系统中承担的责任划分具有不同权限的角色;角色用来作 为权限集合的载体。 

⚫ openGauss 提供了一个隐式定义的拥有所有角色的组PUBLIC,所有创建的用户和角色默 认拥有PUBLIC所拥有的权限。 

⚫ 要撤销或重新授予用户和角色对PUBLIC的权限,可通过在GRANT和REVOKE指定关键字 PUBLIC实现。

用户与角色

⚫ 用户是实体,角色是行为。 

⚫ 用户可被赋予一个或多个角色。

⚫ 角色是一种权限集合,不应该具有登录数据库并执行SQL的能力。 

⚫ 对用户权限的管理,可以简化为对角色权限的管理。 

⚫ 在openGauss中,用户和角色使用相同的操作方式与维护方式。

实际使用中的选择

在OpenGauss中,CREATE USER更常用于以下场景:

需要创建实际登录数据库的账号时

为应用程序或个人用户创建账户时

CREATE ROLE通常用于:

创建权限组(如read_only_role, write_role等)

实现权限继承和组合

作为模板角色

语法

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

这里 option 可以是:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| BYPASSRLS | NOBYPASSRLS
| CONNECTION LIMIT connlimit
| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid

修改角色/用户

ALTER USER role_specification [ WITH ] option [ ... ]

其中 option 可以是:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| BYPASSRLS | NOBYPASSRLS
| CONNECTION LIMIT connlimit
| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
| VALID UNTIL 'timestamp'
ALTER USER name RENAME TO new_name
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ]
SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ]
SET configuration_parameter FROM CURRENT
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ]
RESET configuration_parameter
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL

删除角色/用户

DROP USER [ IF EXISTS ] name [, ...]

查询类操作: 

 openGauss的用户、角色属性维护在pg_authid系统表中,pg_user、pg_roles视图也可以查询 用户、角色信息。 

 使用\d命令查看pg_authid表详细信息。 

 使用select命令查询pg_authid中的相关信息。

角色属性

角色可以拥有属性,属性确定了角色拥有的特权,并且在登录时与客户端认证系统进行交互。

常见的角色属性包括:

登录特权,只有具有 LOGIN 属性的角色才能连接数据库。具有 LOGIN 角色的用户可以

被看作一个数据库用户。使用以下语句创建具有登录特权的角色:

CREATE ROLE name LOGIN;

CREATE USER name;

CREATE USER CREATE ROLE 都可以用于创建角色,只不过 CREATE USER 默认包

含了 LOGIN 选项,而 CREATE ROLE 没有。

超级用户,数据的超级用户可以避开所有的权限检查,只验证登录权限。因此,这是一

个很危险的特权,使用时需要特别小心;最好在日常的操作中避免使用超级用户。使用

以下命令创建一个新的超级用户:

CREATE ROLE name SUPERUSER;

只有超级用户才能创建其他的超级用户。

创建数据库,只有明确授权的角色才能够创建数据库(超级用户除外,因为他们可以避

开权限检查)。使用以下语句创建一个具有数据库创建特权的角色:

CREATE ROLE name CREATEDB;

创建角色,只有明确授权的角色才能够创建其他角色(超级用户除外,因为他们可以避

开权限检查)。使用以下命令创建一个具有角色创建特权的角色:

CREATE ROLE name CREATEROLE;

具有 CREATEROLE 特权的角色还可以修改或删除其他角色,以及为这些角色授予或者

撤销成员角色。但是,针对超级用户的创建、修改、删除,以及它的成员变更,需要超

级用户特权;CREATEROLE 特权无法针对超级用户执行这些操作。

启动复制,只有明确授权的角色才能够启动流复制(超级用户除外,因为他们可以避开

权限检查)。用于流复制的角色还需要拥有 LOGIN 特权。使用以下语句创建可以用于

流复制的角色:

CREATE ROLE name REPLICATION LOGIN;

密码,只有当用户连接数据库使用的客户端认证方法要求提供密码时,密码属性才有意

义。password md5 认证方法需要使用密码。数据库的密码与操作系统的密码相互独立。

使用以下语句在创建角色时指定密码:

CREATE ROLE name PASSWORD 'string';

我们在创建角色时,可以根据需要指定某些属性。例如,以下命令创建一个具有登录特权的

角色 tony,并且为它指定了密码以及密码过期时间:

CREATE ROLE tony WITH LOGIN PASSWORD 'Pass2019' VALID UNTIL '2020-01-01';

-- CREATE USER tony WITH PASSWORD 'Pass2019' VALID UNTIL '2020-01-01';

使用该用户连接到 postgres 数据库:[root@centos7 ~]# psql -h 192.168.56.103 -p 5432 -U tony postgres

Password for user tony:

psql (14.2)

Type "help" for help.

postgres=> \c

You are now connected to database "postgres" AS user "tony".

psql 命令行工具支持许多选项,-h 表示数据库服务器的地址,-p 表示服务的监听端口,-U

表示登录使用的用户名,最后的 postgres 代表要连接的数据库。详细的命令行参数可以使用 psql--help 查看

以下命令创建一个管理角色 admin,它具有创建数据库和创建角色的特权:

opengauss=# CREATE ROLE admin CREATEDB CREATEROLE;
CREATE ROLE

在实践中,最好创建一个拥有 CREATEDB CREATEROLE 特权,但不具有超级用户特权

的管理角色,然后使用该角色执行日常的数据库和角色的管理。这种方式可以避免过度使用超级

用户可能带来的风险。

一个角色被创建之后,可以通过 ALTER ROLE 语句修改它的属性。例如,以下命令可以撤

销角色 admin 创建角色的特权:

opengauss=# ALTER ROLE admin NOCREATEROLE;

ALTER ROLE

2.3 对象授权

当我们使用新创建的用户(tony)连接数据库(hrdb)之后,执行以下查询语句:

hrdb=> SELECT * FROM employees;

ERROR: permission denied for table employees

以上语句执行错误是因为用户没有相应对象上的访问权限。

opengauss使 GRANT 语句进行数据库对象的授权操作。以表为例,基本的授权语法如下:

GRANT privilege_list | ALL

ON [ TABLE ] table_name

TO role_name;

其中,privilege_list 权限列表可以是 SELECTINSERTUPDATEDELETETRUNCATE

等,ALL 表示表上的所有权限。

例如,使用 gauss用户连接 hrdb 数据库后执行以下语句:

hrdb=# GRANT SELECT, INSERT, UPDATE, DELETE

hrdb-# ON employees, departments, jobs

hrdb-# TO tony;

GRANT该语句将 employeesdepartments jobs 表上的增删改查权限授予了 tony 用户。此时 tony

用户就可以访问这些表中的数据:

hrdb=> SELECT first_name, last_name FROM employees;

对表进行授权的 GRANT 语句还支持一些其他选项:

GRANT privilege_list | ALL

ON ALL TABLES IN SCHEMA schema_name

TO role_name;

ALL TABLES IN SCHEMA 表示某个模式中的所有表,可以方便批量授权操作。例如:

hrdb=# GRANT SELECT

hrdb-# ON ALL TABLES IN SCHEMA public

hrdb-# TO tony;

GRANT该语句将 public 模式中所有表的查询权限授予 tony 用户。

我们也可以在 GRANT 语句的最后指定一个 WITH GRANT OPTION,意味着被授权的角色

可以将该权限授权其他角色。例如:

hrdb=# GRANT SELECT, INSERT, UPDATE, DELETE

hrdb-# ON employees, departments, jobs

hrdb-# TO tony WITH GRANT OPTION;

此时,tony 用户不但拥有这些表上的访问权限,还可以将这些权限授予其他角色。

除了授权表的访问权限之外,GRANT 语句还支持字段、视图、序列、数据库、函数、过程、

模式等对象的授权操作

2.4 撤销授权

与授权操作相反的就是撤销权限,opengauss使 REVOKE 语句撤销数据库对象上的权限。同样以表为例,基本的撤销授权语句如下:

REVOKE privilege_list | ALL

ON TABLE table_name

FROM role_name;

其中的参数和 GRANT 语句一致。例如:

hrdb=# REVOKE SELECT, INSERT, UPDATE, DELETE

hrdb-# ON employees, departments, jobs

hrdb-# FROM tony;

REVOKE该语句撤销了用户 tony 访问 employeesdepartments 以及 jobs 表的权限。

REVOKE 语句也支持对某个模式中的所有对象进行操作:

REVOKE privilege_list | ALL

ON ALL TABLES IN SCHEMA schema_name

FROM role_name;

例如以下语句撤销了用户 tony public 模式中所有表上的查询权限:

hrdb=# REVOKE SELECT

hrdb-# ON ALL TABLES IN SCHEMA public

hrdb-# FROM tony;

REVOKEGRANT 语句对应,REVOKE 语句还支持字段、视图、序列、数据库、函数、过程、模

式等对象的撤销授权操作

2.5 角色成员

在现实的环境中,管理员通常需要管理大量的用户和对象权限。为了便于权限管理,减少复

杂度,可以将用户进行分组,然后以组为单位进行权限的授予和撤销操作。

为此,opengauss引入了组(group)角色的概念。具体来说,就是创建一个代表组的角色,

然后将该组的成员资格授予其他用户,让其成为该组的成员。

首先,使用以下创建一个组角色:

CREATE ROLE group_name;

按照习惯,组角色通常不具有 LOGIN 特权,也就是不能作为一个用户登录。

例如,我们可以先创建一个组 managers

CREATE ROLE managers;

然后,使用与对象授权操作相同的 GRANT REVOKE 语句为组添加和删除成员:

GRANT group_name TO user_role, ... ;

REVOKE group_name FROM user_role, ... ;

我们将用户 tony 添加为组 managers 的成员:

opengauss=# GRANT managers TO tony;

GRANT ROLE

最后一行输出显示了成员角色(tony)所属的组(managers)。

也可以将一个组添加为其他组的成员,因为组角色和非组角色并没有什么本质区别。

opengauss=# GRANT admin TO managers;

GRANT ROLE

另外,opengauss不允许设置循环的成员关系,也就是两个角色互相为对方的成员。

opengauss=# GRANT managers TO admin;

ERROR: role "managers" is a member of role "admin"

最后,不能将特殊角色 PUBLIC 设置为任何组的成员。

组角色中的成员可以通过以下方式使用该组拥有的特权:

首先,组中的成员可以通过 SET ROLE 命令将自己的角色临时性变成该组角色。此时,

当前数据库会话拥有该组角色的权限,而不是登录用户的权限;并且会话创建的任何数

据库对象归组角色所有,而不是登录用户所有。

其次,对于具有 INHERIT 属性的角色,将会自动继承它所属的组的全部特权,包括这些

组通过继承获得的特权。

考虑以下示例:

CREATE ROLE user1 LOGIN INHERIT;

CREATE ROLE net_admins NOINHERIT;

CREATE ROLE sys_admins NOINHERIT;

GRANT net_admins TO user1;

GRANT sys_admins TO net_admins;

使用角色 user1 登录之后,数据库会话将会拥有 user1 自身的特权和 net_admins 所有的特权,

因为 user1“继承net_admins 的特权。但是,会话还不具有 sys_admins 所有的特权,因为即使

user1 间接地成为了 sys_admins 的成员,通过 net_admins 获得的成员资格具有 NOINHERIT 属性,

也就不会自动继承权限。如果执行了以下语句:

SET ROLE net_admins;

会话将会拥有 net_admins 所有的特权,但是不会拥有 user1 自身的特权,也不会继承

sys_admins 所有的特权。

如果执行了以下语句:

SET ROLE sys_admins;

会话将会拥有 sys_admins 所有的特权,但是不会拥有 user1 或者 net_admins 所有的特权。

如果想要恢复初始状态的会话特权,可以执行以下任意语句:

SET ROLE user1;

SET ROLE NONE;

RESET ROLE;

SQL 标准中,用户和角色之间存在明确的差异,用户不会自动继承特权,而角色会继承

特权。opengauss可以实现这种行为,只需要为角色设置 INHERIT 属性,而为用户设置

NOINHERIT 属性。但是,为了兼容 8.1 之前的版本实现,PostgreSQL 默认为所有的角色都设置

INHERIT 属性,这样用户总是会继承它所在组的权限。

只有数据库对象上的普通权限可以被继承,角色的 LOGINSUPERUSERCREATEDB

CREATEROLE 属性可以被认为是一些特殊的权限,不会被继承。如果想要使用这些权限,必

须使用 SET ROLE 命令设置为具有这些属性的角色。

基于上面的示例,我们可以为 net_admins 角色指定 CREATEDB CREATEROLE 属性。

ALTER ROLE net_admins CREATEDB, CREATEROLE;

然后再使用 user1 连接数据库,会话不会自动具有这些特权,而是需要执行以下命令:

SET ROLE net_admins;

2.6 删除角色

删除角色的语句如下:

DROP ROLE name;

如果删除的是组角色,该组中的成员关系会自动从组中删除,但是这些成员角色自身不会受

到任何影响。

以下示例删除了角色 admin

opengauss=# drop role admin;

DROP ROLE

由于角色可以拥有数据库中的对象,也可以拥有访问其他对象的权限,删除角色通常不仅仅

只是一个简单的 DROP ROLE 语句。在删除角色之前,需要删除它所拥有的对象,或者将这些对

象重新赋予其他的角色;同时还需要撤销授予该角色的权限。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。