MySQL 入门教程
  • 教程目录
  • 第一章 基础教程
    • 第一节 入门
      • 1.1 安装
      • 1.2 示例数据库
    • 第二节 查询数据
      • 2.1 SELECT 语句
      • 2.2 SELECT DISTINCT 语句
    • 第三节 过滤数据
      • 3.1 WHERE 子句
      • 3.2 AND 运算符
      • 3.3 OR 运算符
      • 3.4 IN 运算符
      • 3.5 BETWEEN 运算符
      • 3.6 LIKE 运算符
      • 3.7 LIMIT 子句
      • 3.8 IS NULL 运算符
    • 第四节 数据排序
      • 4.1 ORDER BY 子句
      • 4.1 自然排序
    • 第五节 连接表
      • 5.1 别名
      • 5.2 INNER JOIN
      • 5.3 LEFT JOIN
      • 5.4 自连接
      • 5.5 CROSS JOIN
    • 第六节 分组数据
      • 6.1 GROUP BY子句
      • 6.2 HAVING 子句
    • 第七节 子查询,派生表和通用表达式
      • 7.1 子查询
      • 7.2 派生表
      • 7.3 公共表表达式
      • 7.4 递归 CTE
    • 第八节 集合操作符
      • 8.1 UNION 和 UNION ALL
      • 8.2 INTERSECT 模拟
    • 第九节 修改数据
      • 9.1 INSERT 语句
      • 9.2 INSERT IGNORE
      • 9.3 UPDATE 语句
      • 9.4 UPDATE JOIN 语句
      • 9.5 DELETE
      • 9.6 ON DELETE CASCADE.
      • 9.7 DELETE JOIN
      • 9.8 REPLACE 语句
      • 9.9 PREPARE 语句
    • 第十节 事务
      • 10.1 事务介绍
      • 10.2 表锁定
    • 第十一节 管理数据库和表
      • 11.1 数据库管理
      • 11.2 MySQL 表类型
      • 11.3 CREATE TABLE
      • 11.4 序列
      • 11.5 ALTER TABLE
      • 11.6 重命名表
      • 11.7 从表中删除列
      • 11.8 向表中添加新列
      • 11.9 删除表
      • 11.10 临时表
      • 11.11 TRUNCATE TABLE
    • 第十二节 索引
      • 12.1 管理索引
      • 12.1 UNIQUE 索引
    • 第十三节 数据类型
      • 13.1 INT
      • 13.2 DECIMAL
      • 13.3 BIT
      • 13.4 BOOLEAN
      • 13.5 CHAR
      • 13.6 VARCHAR
      • 13.7 TEXT
      • 13.8 DATE
      • 13.9 TIME
      • 13.10 DATETIME
      • 13.11 TIMESTAMP
      • 13.12 JSON
      • 13.13 ENUM
    • 第十四节 约束
      • 14.1 NOT NULL 约束
      • 14.2 主键约束
      • 14.2 外键约束
      • 14.4 UNIQUE 约束
      • 14.5 CHECK 约束
    • 第十五节 全球化
      • 15.1 字符集
      • 15.2 校对规则
    • 第十六节 导入和导出
      • 16.1 导入 CSV 文件
      • 16.2 导出为 CSV
  • 第二章 技巧
    • CTE 简介
    • 递归 CTE
    • 邻接列表模型和层次结构
    • 获取行数
    • 比较表
    • 找重复值
    • 删除重复行
    • UUID 和主键
    • 复制表数据
    • 变量
    • 生成列
    • 连续行比较
    • 更改存储引擎
    • 基于正则表达式的搜索
    • row_number 模拟
    • 随机选择记录
    • 选择第 n 个最高纪录
    • 重置自动增量值
    • MariaDB 与 MySQL 比较
    • 间隔
    • NULL 详细和应用
    • 获取今天的日期
    • 将NULL值映射到有意义的值
    • 注释
  • 第三章 存储过程
    • 简介
    • 入门
    • 变量
    • 参数
    • 返回多个值
    • IF语句
    • CASE语句
    • IF和CASE语句的技巧
    • 循环
    • 游标
    • 列出存储过程
    • 错误处理
    • SIGNAL 和 ESIGNAL 语句
    • 存储函数
  • 第四章 触发器
    • 实现
    • 创建
    • 创建多个触发器
    • 管理
    • 计划事件
    • 修改事件
  • 第五章 视图
    • 简介
    • 实现和限制
    • 创建
    • 可更新视图
    • 确保视图一致性
    • 检查选项子句
    • 管理
  • 第六章 全文搜索
    • 简介
    • 定义索引
    • 自然语言全文搜索
    • 布尔全文搜索
    • 查询扩展
    • ngram全文解析器
  • 第七章 函数
  • 第八章 管理
    • 访问控制系统入门
    • 创建用户
    • 授予权限
    • 撤销权限
    • 角色管理
    • 删除用户
    • 维护数据库表
    • 备份数据库
    • 列出数据库
    • 列出表
    • 列出表的列
    • 列出用户
Powered by GitBook
On this page
  • MySQL角色简介
  • MySQL角色的例子
  • 创建角色
  • 授予角色权限
  • 将角色分配给用户帐户
  • 设置默认角色
  • 设置活动角色
  • 撤销角色的权限
  • 删除角色
  • 将权限从用户帐户复制到另一个用户

Was this helpful?

  1. 第八章 管理

角色管理

Previous撤销权限Next删除用户

Last updated 5 years ago

Was this helpful?

在本教程中,您将学习如何使用MySQL角色来简化权限管理。

注意:本教程要求 MySQL 8+ 版本以上操作和执行,或自行参考:

MySQL角色简介

通常,MySQL数据库拥有多个相同权限集合的用户。以前,向多个用户授予和撤销权限的唯一方法是单独更改每个用户的权限,假如用户数量比较多的时候,这是非常耗时的。

为了用户权限管理更容易,MySQL提供了一个名为role的新对象,它是一个命名的特权集合。

如果要向多个用户授予相同的权限集,则应如下所示:

  • 首先,创建新的角色。

  • 第二,授予角色权限。

  • 第三,授予用户角色。

如果要更改用户的权限,则需要仅更改授权角色的权限。这些更改角色的权限将对授予角色的所有用户生效。

MySQL角色的例子

首先,创建一个名为crmdb的新数据库,用于存储客户关系管理数据。

CREATE DATABASE crmdb;

接下来,切换到crmdb数据库:

USE crmdb;

然后,在crmdb数据库中创建一个客户信息表:customer,其结构如下 -

USE crmdb;
CREATE TABLE `crmdb`.`customer`(
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name varchar(255) NOT NULL, 
    last_name VARCHAR(255) NOT NULL, 
    phone VARCHAR(32) NOT NULL,
    email VARCHAR(255)
);

之后,将一些数据插入到客户(customer)表中。

INSERT INTO customer(first_name,last_name,phone,email)
VALUES('Max','Su','(+86)-0898-66887654','max.su@yiibai.com'),
      ('Lily','Bush','(+86)-0898-66887985','lily.bush@yiibai.com');
mysql> SELECT * FROM customer;
+----+------------+-----------+---------------------+----------------------+
| id | first_name | last_name | phone               | email                |
+----+------------+-----------+---------------------+----------------------+
|  1 | Max        | Su        | (+86)-0898-66887654 | max.su@yiibai.com    |
|  2 | Lily       | Bush      | (+86)-0898-66887985 | lily.bush@yiibai.com |
+----+------------+-----------+---------------------+----------------------+
2 rows in set

创建角色

假设您开发了一个使用crmdb数据库的应用程序。要与crmdb数据库进行交互,您需要为需要完全访问数据库的开发人员创建帐户。此外,需要为仅需读取访问权限的用户创建帐户,以及为读取/写入访问权限的用户创建帐户。

要避免单独为每个用户帐户授予权限,您可以创建一组角色,并为每个用户帐户授予相应的角色。

要创建新角色,请使用CREATE ROLE语句,我们根据上面所述,一共要创建三个角色:

CREATE ROLE IF NOT EXISTS 'crm_dev', 'crm_read', 'crm_write';

角色名称类似于由用户和主机部分组成的用户帐户:role_name@host_name 。

如果省略主机部分,则默认为“%”,表示任何主机。

授予角色权限

要授予角色权限,您可以使用GRANT语句。 以下语句是向crm_dev角色授予crmdb数据库的所有权限:

GRANT ALL ON crmdb.* TO crm_dev;

以下语句授予crm_read角色SELECT权限:

GRANT SELECT ON crmdb.* TO crm_read;

以下语句赋予crm_write角色INSERT,UPDATE和DELETE权限:

GRANT INSERT, UPDATE, DELETE ON crm.* TO crm_write;

将角色分配给用户帐户

假设您需要一个用户帐户是开发人员,一个是具有只读访问权限的用户帐户和两个具有读/写访问权限的用户帐户。

-- developer user 
CREATE USER crm_dev1@localhost IDENTIFIED BY 'passwd1990';
-- read access user
CREATE USER crm_read1@localhost IDENTIFIED BY 'passwd1990';    
-- read/write users
CREATE USER crm_write1@localhost IDENTIFIED BY 'passwd1990';   
CREATE USER crm_write2@localhost IDENTIFIED BY 'passwd1990';

为了方便演示使用,所有用户密码都设置成一样的。

要为用户分配角色,请使用GRANT语句:

GRANT crm_dev TO crm_dev1@localhost;

GRANT crm_read TO crm_read1@localhost;

GRANT crm_read, crm_write TO crm_write1@localhost, crm_write2@localhost;

请注意,crm_write1@localhost和crm_write2@localhost帐户的GRANT语句同时授予crm_read和crm_write角色。

要验证角色分配,请使用SHOW GRANTS语句,如下所示:

SHOW GRANTS FOR crm_dev1@localhost;

该语句返回以下结果集:

+-----------------------------------------------+
| Grants for crm_dev1@localhost                 |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO `crm_dev1`@`localhost`  |
| GRANT `crm_dev`@`%` TO `crm_dev1`@`localhost` |
+-----------------------------------------------+
2 rows in set (0.02 sec)

正如你所看到的,它只返回授予角色。要显示角色所代表的权限,请使用USING子句和授权角色的名称,如下所示:

SHOW GRANTS FOR crm_write1@localhost USING crm_write;

该语句返回以下输出:

+---------------------------------------------------------------------+
| Grants for crm_write1@localhost                                     |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `crm_write1`@`localhost`                      |
| GRANT INSERT, UPDATE, DELETE ON `crm`.* TO `crm_write1`@`localhost` |
| GRANT `crm_read`@`%`,`crm_write`@`%` TO `crm_write1`@`localhost`    |
+---------------------------------------------------------------------+

设置默认角色

现在,如果您使用crm_read1用户帐户连接到MySQL,并尝试访问yiibaidb数据库:

mysql -u crm_read1 -p
Enter password: ***********
mysql>USE crmdb;

上面语句发出以下错误信息:

ERROR 1044 (42000): Access denied for user 'crm_read1'@'localhost' to database 'crmdb'

这是因为在向用户帐户授予角色时,当用户帐户连接到数据库服务器时,它不会自动使角色变为活动状态。

如果调用CURRENT_ROLE()函数:

SELECT current_role();

+----------------+
| current_role() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.00 sec)

它返回NONE,意味着没有启用角色。

要在每次用户帐户连接到数据库服务器时指定哪些角色应该处于活动状态,请使用SET DEFAULT ROLE语句。

以下语句为crm_read1@localhost帐户的所有分配角色设置默认值。

SET DEFAULT ROLE ALL TO crm_read1@localhost;

现在,如果当使用crm_read1用户帐户连接到MySQL数据库服务器并调用CURRENT_ROLE()函数:

> mysql -u crm_read1 -p
Enter password: ***********
>SELECT CURRENT_ROLE();

您将看到crm_read1用户帐户的默认角色,如下所示 -

可以通过将当前数据库切换到crmdb数据库,执行SELECT语句和DELETE语句来测试crm_read帐户的权限,如下所示:

mysql> use crmdb;
Database changed
mysql> SELECT COUNT(*) FROM customer;
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

mysql> DELETE FROM customer;
ERROR 1142 (42000): DELETE command denied to user 'crm_read1'@'localhost' for table 'customer'

如上面结果所示,它的确按预期那样工作。当我们发出DELETE语句时,就收到一个错误,因为crm_read1用户帐户只能读取访问权限。

设置活动角色

用户帐户可以通过指定哪个授权角色处于活动状态来修改当前用户在当前会话中的有效权限。

以下语句将活动角色设置为NONE,表示没有活动角色。

SET ROLE NONE;

要将活动角色设置为所有授予的角色,请使用:

SET ROLE ALL;

要将活动角色设置为由SET DEFAULT ROLE语句设置的默认角色,请使用:

SET ROLE DEFAULT;

要设置活动的命名角色,请使用:

SET ROLE granted_role_1, granted_role_2, ...

撤销角色的权限

要从特定角色撤销权限,请使用REVOKE语句。REVOKE语句不仅起到角色的作用,而且也赋予任何授予角色的帐户。

例如,要临时使所有读/写用户只读,您可以更改crm_write角色,如下所示:

REVOKE INSERT, UPDATE, DELETE ON crmdb.* FROM crm_write;

要恢复权限,需要重新授予它们权限,如下所示:

GRANT INSERT, UPDATE, DELETE ON crmdb.* FOR crm_write;

删除角色

要删除一个或多个角色,请使用DROP ROLE语句,如下所示:

DROP ROLE role_name, role_name, ...;

像REVOKE语句一样,DROP ROLE语句从其授予的每个用户帐户中撤销角色。

例如,要删除crm_read,crm_write角色,请使用以下语句:

DROP ROLE crm_read, crm_write;

将权限从用户帐户复制到另一个用户

MySQL将用户帐户视为角色,因此,可以将用户帐户授予另一个用户帐户,例如向该用户帐户授予角色。这允许将用户的权限复制到另一个用户。

假设您需要crmdb数据库的另一个开发人员帐户:

首先,创建新的用户帐户:

CREATE USER crm_dev2@localhost IDENTIFIED BY 'passwd1990';

其次,将crm_dev1用户帐户的权限复制到crm_dev2用户帐户,如下所示:

GRANT crm_dev1@localhost TO crm_dev2@localhost;

在本教程中,您已经学会了如何使用MySQL角色来管理用户帐户的权限。

最后,使用以下验证插入结果:

要创建新用户,请使用语句,如下所示:

http://dev.mysql.com/doc/refman/8.0/en/roles.html
SELECT语句
CREATE USER