MySQL · 社区动态 · MariaDB Role 体系

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 背景 从 MairaDB 10.0.5 开始,MariaDB 开始提供 Role(角色)的功能,补全了大家一直吐槽的 MySQL 不能像 Oracle 一样支持角色定义的功能。 一个角色就是把一堆的权限捆绑在一起授权,这个功能对于有很多用户拥有相同权限的情况可以显著提高管理效率。在有角色之前,这

背景

从 MairaDB 10.0.5 开始,MariaDB 开始提供 Role(角色)的功能,补全了大家一直吐槽的 MySQL 不能像 Oracle 一样支持角色定义的功能。

一个角色就是把一堆的权限捆绑在一起授权,这个功能对于有很多用户拥有相同权限的情况可以显著提高管理效率。在有角色之前,这种情况只能为每个用户都做一大堆的授权操作,或者是给很多个需要相同权限的用户提供同一个账号去使用,这又会导致你要分析用户行为的时候不知道哪个操作是哪个具体用户发起的。

有了角色,这样的管理就太容易了。例如,可以把权限需求相同的用户赋予同一个角色,只要定义好这个角色的权限就行,要更改这类用户的权限,只需要更改这个角色的权限就可以了,变化会影响到所有这个角色的用户。

用法

创建角色需要使用 CREATE ROLE 语句,删除角色使用 DROP ROLE 语句。然后再通过 GRANT 语句给角色增加授权,也可以把角色授权给用户,然后这个角色的权限就会分配给这个用户。同样,REVOKE 语句也可以用来移除角色的授权,或者把一个用户移除某个角色。

一旦用户连接上来,他可以执行 SET ROLE 语句来把自己切换到某个被授权的角色下,从而使用这个角色的权限。通过 CURRENT_ROLE 函数可以显示当前用户执行在哪个角色下,没有就是 NULL。

只有直接被授予用户的角色才可以使用 SET ROLE 语句,间接授予的角色并不能被 SET ROLE 设置。例如角色B被授予角色A,而角色A被授予用户A,那么用户A只能 SET ROLE 角色A,而不能设置角色B。

从 MariaDB 10.1.1 开始,可以利用 SET DEFAULT ROLE 语句来给某个用户设置默认的角色。当用户链接的时候,会默认使用这个角色,其实就是连接后自动做了一个 SET ROLE 语句。

使用举例

创建一个角色并给他赋权:

CREATE ROLE journalist;
GRANT SHOW DATABASES ON *.* TO journalist;
GRANT journalist to hulda;

这里 hulda 并不马上拥有 SHOW DATABASES 权限,他还需要先执行一个 SET ROLE 语句启用这个角色:

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| NULL         |
+--------------+
SET ROLE journalist;
SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| journalist   |
+--------------+
SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| ...                |
| information_schema |
| mysql              |
| performance_schema |
| test               |
| ...                |
+--------------------+
SET ROLE NONE;

角色也可以授权给另一个角色:

CREATE ROLE writer;
GRANT SELECT ON data.* TO writer;
GRANT writer TO journalist;

但是只能 SET ROLE 直接给用户的角色。像这里 hulda 只能 SET ROLE journalist,而不能 SET ROLE writer,并且只要启用了 journalist 角色,hulda 也自动获得了 writer 角色的权限:

SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| NULL         |
+--------------+
SHOW TABLES FROM data;
Empty set (0.01 sec)

SET ROLE journalist;
SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| journalist   |
+--------------+
SHOW TABLES FROM data;
+------------------------------+
| Tables_in_data               |
+------------------------------+
| set1                         |
| ...                          |
+------------------------------+

角色和视图、存储过程。

当用户设置启用了一个角色,从某种意义上说他有两个身份的权限集合(用户本身和他的角色)但是一个视图或者存储过程只能有一个定义者。所以,当一个视图或者存储过程通过 SQL SECURITY DEFINER 创建时,只能指定 CURRENT_USER 或者 CURRENT_ROLE 中的一个。所以有些情况下,你创建了一个视图,但是你却可能没法使用它。

CREATE ROLE r1;
GRANT ALL ON db1.* TO r1;
GRANT r1 TO foo@localhost;
GRANT ALL ON db.* TO foo@localhost;
SELECT CURRENT_USER
+---------------+
| current_user  |
+---------------+
| foo@localhost |
+---------------+
SET ROLE r1;
CREATE TABLE db1.t1 (i int);
CREATE VIEW db.v1 AS SELECT * FROM db1.t1;
SHOW CREATE VIEW db.v1;
+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                                              | character_set_client | collation_connection |
+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v1   | CREATE ALGORITHM=UNDEFINED DEFINER=`foo`@`localhost` SQL SECURITY DEFINER VIEW `db`.`v1` AS SELECT `db1`.`t1`.`i` AS `i` from `db1`.`t1` | utf8                 | utf8_general_ci      |
+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
CREATE DEFINER=CURRENT_ROLE VIEW db.v2 AS SELECT * FROM db1.t1;
SHOW CREATE VIEW db.b2;
+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                                 | character_set_client | collation_connection |
+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v2   | CREATE ALGORITHM=UNDEFINED DEFINER=`r1` SQL SECURITY DEFINER VIEW `db`.`v2` AS select `db1`.`t1`.`a` AS `a` from `db1`.`t1` | utf8                 | utf8_general_ci      |
+------+---------------------------------------------------------------------------------------
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9月前
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
337 8
|
9月前
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
847 0
|
9月前
|
SQL Ubuntu 关系型数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
152 0
|
9月前
|
关系型数据库 MySQL 数据库连接
FreeSWITCH通过mod_mariadb原生连接MySQL
FreeSWITCH通过mod_mariadb原生连接MySQL
551 0
|
16天前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
16天前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
2月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
447 82
|
23天前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
28天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。

相关产品

  • 云数据库 RDS MySQL 版