OpenGauss的用户和角色【华为根技术】
【摘要】 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 权限列表可以是 SELECT、INSERT、UPDATE、DELETE、TRUNCATE
等,ALL 表示表上的所有权限。
例如,使用 gauss用户连接 hrdb 数据库后执行以下语句:
hrdb=# GRANT SELECT, INSERT, UPDATE, DELETE
hrdb-# ON employees, departments, jobs
hrdb-# TO tony;
GRANT该语句将 employees、departments 和 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 访问 employees、departments 以及 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;
REVOKE与 GRANT 语句对应,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 属性,这样用户总是会继承它所在组的权限。
只有数据库对象上的普通权限可以被继承,角色的 LOGIN、SUPERUSER、CREATEDB 以
及 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)