欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

入门MySQL——用户与权限

程序员文章站 2023-11-02 18:37:22
前言: 前面几篇文章为大家介绍了各种SQL语法的使用,本篇文章将主要介绍MySQL用户及权限相关知识,如果你不是DBA的话可能平时用的不多,但是了解下也是好处多多。 1.创建用户 官方推荐创建语法为: 通常我们常用的创建语法为: 语法说明如下: 1) 指定创建用户账号,格式为 'user_name' ......

前言: 

前面几篇文章为大家介绍了各种sql语法的使用,本篇文章将主要介绍mysql用户及权限相关知识,如果你不是dba的话可能平时用的不多,但是了解下也是好处多多。

1.创建用户

官方推荐创建语法为:

create user [if not exists]
    user [auth_option] [, user [auth_option]] ...
    [require {none | tls_option [[and] tls_option] ...}]
    [with resource_option [resource_option] ...]
    [password_option | lock_option] ...

user:
    (see section 6.2.4, “specifying account names”)

auth_option: {
    identified by 'auth_string'
  | identified with auth_plugin
  | identified with auth_plugin by 'auth_string'
  | identified with auth_plugin as 'auth_string'
  | identified by password 'auth_string'
}

tls_option: {
   ssl
 | x509
 | cipher 'cipher'
 | issuer 'issuer'
 | subject 'subject'
}

resource_option: {
    max_queries_per_hour count
  | max_updates_per_hour count
  | max_connections_per_hour count
  | max_user_connections count
}

password_option: {
    password expire
  | password expire default
  | password expire never
  | password expire interval n day
}

lock_option: {
    account lock
  | account unlock
}

通常我们常用的创建语法为:

create user <用户名> [ identified ] by [ password ] <口令>

语法说明如下:
1) 用户名>
指定创建用户账号,格式为 'user_name'@'host_name'。这里user_name是用户名,host_name为主机名,即用户连接 mysql 时所在主机的名字。若在创建的过程中,只给出了账户的用户名,而没指定主机名,则主机名默认为“%”,表示一组主机。
2) password
可选项,用于指定散列口令,即若使用明文设置口令,则需忽略password关键字;若不想以明文设置口令,且知道 password() 函数返回给密码的散列值,则可以在口令设置语句中指定此散列值,但需要加上关键字password
3) identified by子句
用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。
4) 口令>
指定用户账号的口令,在identified by关键字或passwoed关键字之后。给定的口令值可以是只由字母和数字组成的明文,也可以是通过 password() 函数得到的散列值。

使用 create user 语句应该注意以下几点:

  • 如果使用 create user 语句时没有为用户指定口令,那么 mysql 允许该用户可以不使用口令登录系统,然而从安全的角度而言,不推荐这种做法。
  • 使用 create user 语句必须拥有 mysql 中 mysql 数据库的 insert 权限或全局 create user 权限。
  • 使用 create user 语句创建一个用户账号后,会在系统自身的 mysql 数据库的 user 表中添加一条新记录。若创建的账户已经存在,则语句执行时会出现错误。
  • 新创建的用户拥有的权限很少。他们可以登录 mysql,只允许进行不需要权限的操作,如使用 show 语句查询所有存储引擎和字符集的列表等。
  • 如果两个用户具有相同的用户名和不同的主机名,mysql 会将他们视为不同的用户,并允许为这两个用户分配不同的权限集合。

示例:

#注意:test_user@'%' 和 test_user@'localhost' 是两个不同的用户
create user 'test_user'@'%' identified by '123456';
create user 'test_user'@'localhost' identified by '123456789';

2.更改用户

更改用户信息主要包括重命名,改密码,锁定或解锁用户。下面将通过案例为大家展示这些用法:

#重命名用户
rename user 'test_user'@'%' to 'test'@'%';

#修改密码
alter user 'test'@'%' identified by '123456789';

#锁定或解锁用户
alter user 'test'@'%' account lock;
alter user 'test'@'%' account unlock;

3.删除用户

mysql 数据库中可以使用 drop user 语句来删除一个或多个用户账号以及相关的权限。
官方推荐语法格式:

drop user [if exists] user [, user] ...

使用 drop user 语句应该注意以下几点:

  • drop user 语句可用于删除一个或多个 mysql 账户,并撤销其原有权限。
  • 使用 drop user 语句必须拥有 mysql 中的 mysql 数据库的 delete 权限或全局 create user 权限。
  • 在 drop user 语句的使用中,若没有明确地给出账户的主机名,则该主机名默认为“%”。

4.用户授权

当成功创建用户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用 show grant for 语句来查询用户的权限。

注意:新创建的用户只有登录 mysql 服务器的权限,没有任何其他权限,不能进行其他操作。
usage on . 表示该用户对任何数据库和任何表都没有权限。

对于新建的 mysql 用户,必须给它授权,可以用 grant 语句来实现对新建用户的授权。官方推荐语法格式:

grant
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    on [object_type] priv_level
    to user [auth_option] [, user [auth_option]] ...
    [require {none | tls_option [[and] tls_option] ...}]
    [with {grant option | resource_option} ...]

grant proxy on user
    to user [, user] ...
    [with grant option]

object_type: {
    table
  | function
  | procedure
}

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

user:
    (see section 6.2.4, “specifying account names”)

auth_option: {
    identified by 'auth_string'
  | identified with auth_plugin
  | identified with auth_plugin by 'auth_string'
  | identified with auth_plugin as 'auth_string'
  | identified by password 'auth_string'
}

tls_option: {
    ssl
  | x509
  | cipher 'cipher'
  | issuer 'issuer'
  | subject 'subject'
}

resource_option: {
  | max_queries_per_hour count
  | max_updates_per_hour count
  | max_connections_per_hour count
  | max_user_connections count
}

首先大家要知道,权限是分级别的。可以授予的权限有如下几组:

  • 列级别,和表中的一个具体列相关。例如,可以使用 update 语句更新表 students 中 student_name 列的值的权限。
  • 表级别,和一个具体表中的所有数据相关。例如,可以使用 select 语句查询表 students 的所有数据的权限。
  • 数据库级别,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
  • 全局,和 mysql 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。

下表是所有可授予的权限及其意义:

权限 意义和可授予级别
all [privileges] 授予在指定的访问级别的所有权限,除了 grant option和 proxy
alter 启用alter table。级别:全局,数据库,表。
alter routine 允许更改或删除存储过程。级别:全局,数据库。
create 启用数据库和表创建。级别:全局,数据库,表。
create routine 启用存储过程创建。级别:全局,数据库。
create tablespace 启用要创建,更改或删除的表空间和日志文件组。等级:全局。
create temporary tables 启用create temporary table。级别:全局,数据库。
create user 允许使用create user, drop user, rename user,和 revoke all privileges。等级:全球。
create view 启用要创建或更改视图。级别:全局,数据库,表。
delete 启用delete。级别:全局,数据库,表。
drop 启用要删除数据库,表和视图。级别:全局,数据库,表。
event 启用事件使用。级别:全局,数据库。
execute 使用户能够执行存储过程。级别:全局,数据库。
file 使用户能够使服务器读取或写入文件。等级:全局。
grant option 启用授予其他帐户或从其他帐户中删除的权限。级别:全局,数据库,表,代理。
index 启用要创建或删除索引。级别:全局,数据库,表。
insert 启用insert。级别:全局,数据库,表,列。
lock tables 允许使用lock tables您拥有该select 权限的表。级别:全局,数据库。
process 使用户能够查看所有进程show processlist。等级:全局。
proxy 启用用户代理。级别:从用户到用户。
references 启用外键创建。级别:全局,数据库,表,列。
reload 启用flush操作。等级:全局。
replication client 使用户可以询问主服务器或从服务器的位置。等级:全局。
replication slave 启用复制从属以从主服务器读取二进制日志。等级:全局。
select 启用select。级别:全局,数据库,表,列。
show databases 启用show databases以显示所有数据库。等级:全局。
show view 启用show create view。级别:全局,数据库,表。
shutdown 启用。等级:全局。
super 能够使用如其他命令 change master to, kill, purge binary logs, set global,和命令。等级:全局。
trigger 启用触发操作。级别:全局,数据库,表。
update 启用update。级别:全局,数据库,表,列。
usage “ no privileges ”的同义词

其实grant语句可以直接创建用户并授权,这里建议大家先用create user语句创建好用户之后再单独进行授权。下面我将用示例为大家展示如何授权:

#全局权限
grant super,select on *.* to 'test_user'@'%';

#库权限
grant select,insert,update,delete,create,alter,execute on `testdb`.* to 'test_user'@'%';

#表权限
grant select,insert on `testdb`.tb to 'test_user'@'%';

#列权限
grant select (col1), insert (col1, col2) on `testdb`.mytbl to 'test_user'@'%';

5.回收权限

在mysql中,可以使用 revoke 语句回收一个用户的权限,此用户不会被删除。

revoke
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    on [object_type] priv_level
    from user [, user] ...

revoke all [privileges], grant option
    from user [, user] ...

语法说明如下:

  • revoke 语法和 grant 语句的语法格式相似,但具有相反的效果。
  • 第一种语法格式用于回收某些特定的权限。
  • 第二种语法格式用于回收特定用户的所有权限。
  • 要使用 revoke 语句,必须拥有 mysql 数据库的全局 create user 权限或 update 权限。

一般情况下我们先会使用show grants语法查询该用户的权限,如果发现权限过大,会用revoke语法回收权限。示例如下:

#查看用户权限
mysql> show grants for 'test_user'@'%';
+-----------------------------------------------------------------------------------------------------+
| grants for test_user@%                                                                              |
+-----------------------------------------------------------------------------------------------------+
| grant usage on *.* to 'test_user'@'%'                                                               |
| grant select, insert, update, delete, create, drop, alter, execute on `testdb`.* to 'test_user'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

#发现权限过大,想回收drop,alter权限 则可以这样回收:
revoke drop,alter on `testdb`.* from 'test_user'@'%';

总结: 

本篇文章为大家介绍了如何创建,更改,删除用户以及如何授于和回收权限。希望大家能对mysql中用户管理这一块能有更深的认识。入门mysql系列文章写了好几篇了,一开始并没有想好写多少篇的准备,可能逻辑也不太合理,还是感谢大家的阅读。最后一篇打算写备份与恢复相关内容,大家期待一下哦!