1. 闲不住的人首页
  2. 技术笔记
  3. 数据库
  4. MySQL

MySQL GRANT 授权

本文主要演示了如何使用 mysql grant 语句为用户授权,mysql grant 授权时的几个作用级别,以及如何查看 mysql 用户权限。最后演示如何使用 mysql revoke 语句回收权限。

MySQL 数据库中,创建一个用户后,该用户没有任何操作权限,经过 DBA 按需授权后,才能够对数据库进行相关操作。授权后的权限信息都会存放在 MySQL 的内部数据库中,数据库名就叫 mysql,并在数据库启动后把权限信息复制到内存中。

通常,数据库管理员首先使用 CREATE USER 创建一个用户并设置该用户的密码,是否使用安全连接以及对服务器资源的访问限制,然后使用 GRANT 为其进行授权。MySQL 中数据库权限大致分为以下几个级别:

  • 全局性的管理权限:作用于整个 MySQL 实例。
  • 数据库级别权限,作用于某个指定的数据库上。
  • 表级别权限:作用于某个数据库的单个表上。
  • 列级别权限:作用于某张数据表的某个列上。

MySQL GRANT 授权

mysql grant 语法格式:

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]
    [AS user
        [WITH ROLE
            DEFAULT
          | NONE
          | ALL
          | ALL EXCEPT role [, role ] ...
          | role [, role ] ...
        ]
    ]
}

GRANT PROXY ON user_or_role
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]

GRANT role [, role] ...
    TO user_or_role [, user_or_role] ...
    [WITH ADMIN OPTION]

object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

user_or_role: {
    user (see Section 6.2.4, “Specifying Account Names”)
  | role (see Section 6.2.5, “Specifying Role Names”)
}

具体语法说明参见:https://dev.mysql.com/doc/refman/8.0/en/grant.html

接下来会根据不同级别的权限分别演示如何对用户进行授权。

全局级别权限

全局权限就是授予用户拥有所有数据库的管理权限,作用在整个 MySQL 服务器上。要分配全局权限请使用 ON *.* 这里的 *.* 表示授予所有数据库下的所有表的意思,语法:

GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';

下面以 MySQL 8.0 版本为例,创建一个用户,并授予全局权限,拥有对所有数据库下的所有表执行 SELECT 的权限:

mysql> CREATE USER 'ops'@'localhost' IDENTIFIED BY 'xbzdr.com';
Query OK, 0 rows affected (0.25 sec)

mysql> GRANT SELECT ON *.* TO 'ops'@'localhost';
Query OK, 0 rows affected, 1 warning (0.17 sec)

数据库级别权限

数据库级别的权限,是授予用户对某个特定数据库拥有权限,要分配数据库级别权限请使用 ON db_name.* 这里的 db_name.* 表示该数据库下的所有表,语法:

GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';

下面以 MySQL 8.0 版本为例,创建一个用户,并授予数据库级别权限,拥有对 `mydb数据库下的所有表执行『增删改查』的权限:

mysql> CREATE USER 'enzhi'@'localhost' IDENTIFIED BY 'xbzdr.com';
Query OK, 0 rows affected (0.17 sec)

mysql> GRANT SELECT,DELETE,UPDATE,INSERT ON mydb.* TO 'enzhi'@'localhost';
Query OK, 0 rows affected, 1 warning (0.19 sec)

表级别权限

表级别的权限,是授予用户对数据库中的某一张表的所有列都用于权限,要分配表级别的权限请使用 ON db_name.tb_name 语法:

GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';

下面以 MySQL 8.0 版本为例,创建一个用户 dev,并授予表级别权限,拥有对 mydb 数据库下的 students 表执行『增删改查』的权限:

mysql> CREATE USER 'dba'@'localhost' IDENTIFIED BY '11111111';
Query OK, 0 rows affected (0.22 sec)

mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON mydb.students TO 'dba'@'localhost';
Query OK, 0 rows affected, 1 warning (0.18 sec)

列级别权限

列特权适用于给定表中的单个列。在列级别要授予的每个特权都必须在括号后加上一个或多个列。语法:

GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';

下面以 MySQL 8.0 版本为例,授权 dba 用户,拥有对 id 列的查看权限,name 和 age 列拥有写入权限:

mysql> GRANT SELECT(id),INSERT(name,age) ON mydb.students TO 'dba'@'localhost';
Query OK, 0 rows affected, 1 warning (0.15 sec)

查看 MySQL 用户权限

要查看用户拥有哪些权限,请使用 show grants 语句,语法:

SHOW GRANTS
    [FOR user_or_role
        [USING role [, role] ...]]

user_or_role: {
    user (see Section 6.2.4, “Specifying Account Names”)
  | role (see Section 6.2.5, “Specifying Role Names”.
}

查看当前用户自己的权限

mysql> show grants;

查看其他用户的权限

mysql> show grants for 'ops'@'localhost';

撤销 MySQL 用户权限

REVOKE 语法格式与 GRANT 语法类似,把关键字 FOR 换成 FROM 即可。具体语法格式如下:

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user_or_role [, user_or_role] ...

REVOKE ALL [PRIVILEGES], GRANT OPTION
    FROM user_or_role [, user_or_role] ...

REVOKE PROXY ON user_or_role
    FROM user_or_role [, user_or_role] ...

REVOKE role [, role ] ...
    FROM user_or_role [, user_or_role ] ...

user_or_role: {
    user (see Section 6.2.4, “Specifying Account Names”)
  | role (see Section 6.2.5, “Specifying Role Names”.
}

下面以 MySQL 8.0 版本为例,撤销 dba 用户对所有数据库的 ISNERT 权限:

mysql> REVOKE INSERT ON *.* FROM 'dba'@'localhost';
Query OK, 0 rows affected, 1 warning (0.13 sec)

撤销 dba 用户对 mydb.students 表中的 name 和 age 字段的 INSERT 权限:

mysql> REVOKE INSERT(name,age) ON mydb.students FROM 'dba'@'localhost';

公众号

公众号Linux运维入门

原创文章,作者:王恩志,如若转载,请注明出处:https://www.xbzdr.com/761.html

如果您喜欢本站,点击这儿 不花一分钱捐赠本站

发表评论

登录后才能评论

联系我们

在线咨询:点击这里给我发消息

邮件:510749025@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code