16.1 MYSQL数据库所提供的权限

 16.1.1 系统表 mysql.user

 1. 用户字段

  • Host:主机名;
  • User:用户名;
  • Password:密码。

 2. 权限字段

以“_priv”字符串结尾的字段

通常,可以使用GRANT语句为用户赋予一些权限,也可以通过Update语句更新user表的方式来设置权限;

不过,修改user表之后,一定要执行一下FLUSH PRIVILEGES,否则可能会出现如下错误:

Error (1133): Can’t find any matching row in the user table

user表中的列

权限名称

权限范围

 Create_priv

 CREATE

 数据库、表或索引

 Drop_priv

 DROP

 数据库或表

 Grant_priv

 GRANT OPTION

 数据库、表、存储过程、函数

 References_priv

 REFERENCES

 数据库和表

 Alter_priv

 ALTER

 修改表

 Delete_priv

 DELETE

 删除表

 Index_priv

 INDEX

 用索引查询表

 Insert_priv

 INSERT

 插入表

 Select_priv

 SELECT

 查询表

 Update_priv

 UPDATE

 更新表

 Create_view_priv

 CEATE VIEW

 创建视图

 Show_view_priv

 SHOW VIEW

 查看视图

 Create_routine_priv

 CREATE ROUTINE

 创建存储过程或函数

 Alter_routine_priv

 ALTER ROUTINE

 修改存储过程或函数

 Execute_priv

 EXECUTE

 执行存储过程或函数

 File_priv

 FILE

 加载服务器主机上的文件

 Create_tmp_table_priv

 CREATE TEMPORARY TABLES

 创建临时表

 Lock_tables_priv

 LOCK TABLES

 锁定表

 Create_user_priv  

 CREATE USER

 创建用户

 Process_priv

 PROCESS

 服务器管理

 Reload_priv 

 RELOAD

 重新加载权限表

 Repl_client_priv

 REPLICATION CLIENT

 服务器管理

 Repl_slave_priv

 REPLICATION SLAVE

 服务器管理

 Show_db_priv

 SHOW DATABASES

 查看数据库

 Shutdown_priv

 SHUTDOWN

 关闭服务器

 Super_priv

 SUPER

 超级权限

Event_priv

 

 创建、修改和删除事件

Trigger_priv

 

 创建和删除触发器

 3. 安全字段

字段名

含义

ssl_type

支持ssl标准加密的安全字段

ssl_cipher

支持ssl标准加密的安全字段

x509_issuer

支持x509标准的字段

x509_subject

支持x509标准的字段

在MySQL中,包含ssl字符串的字段主要用来实现加密,包含x509字符串的字段主要用来标识用户。

MySQL的字段通常不支持ssl标准,可以通过以下语句查看字段是否支持ssl标准:



SHOW VARIABLES LIKE 'have_openssl'



 

 4.资源控制字段

  • max_questions:每小时可以允许执行多少次查询;
  • max_updates:每小时可以允许执行多少次更新;
  • max_connections:每小时可以建立多少连接;
  • max_user_connections:单个用户可以同时具有的连接数。

默认值为0,表示无限制。

 

 16.1.2 系统表 mysql.db 和 mysql.host

 1.用户字段

mysql.db

  • Host:主机名;
  • User:用户名;
  • Db:数据库名。

mysql.host 是mysql.db的扩展

  • Host:主机名;
  • Db:数据库名。

当查找某个用户的权限,首先会从系统表 mysql.db 中查找,如果找不到Host的值,则到 mysql.host 去查找。

 

 2.权限字段

mysql.db比mysql.host多了两个字段:

  • Create_routine_priv:创建存储过程或函数权限。
  • Alter_routine_priv:修改存储过程或函数权限。

 

 16.1.3 其他权限表
  1. mysql.tables_priv:实现单个表的权限设置。
  2. columns_priv:实现单个字段列的权限设置。

 

16.2 MYSQL数据库所提供的用户机制

 16.2.1 登录和退出MySQL



mysql -h hostname|hostIP -p port -u username -p DatabaseName -e "SQ语句"



 -p port:未指定默认为3306;

 DatabaseName:未指定默认为mysql.

 



EXIT|QUIT



 

 16.2.2 创建普通用户账户

 1.CREATE USER



CREATE USER username[IDENTIFIED BY [PASSWORD] 'password']
    [,IDENTIFIED BY [PASSWORD] 'password']
    ......



 2.INSERT INTO



INSERT INTO mysql.user(Host,User,Password[,ssl_cipher,x509_issuer,x509_subject])
    VALUES('%','username',PASSWORD('password')[,'','','']);



 3.GRANT



GRANT priv_type ON databasename.tablename
    TO username[IDENTIFIED BY [PASSWORD] 'password']
    [,username [IDENTIFIED BY [PASSWORD] 'password']]
    ......



 

 16.2.3 利用root修改root用户账号密码

 1.mysqladmin



mysqladmin -u username -p password "newpassword";



 2.SET PASSWORD



SET PASSWORD=PASSWORD("newpassword");



 3.UPDATE



UPDATE mysql.user SET password=PASSWORD("newpassword")
    WHERE user="root" AND host="localhost";



 

 16.2.4 利用root修改普通用户账号密码

 1.GRANT



GRANT priv_type ON database.table
    TO user[IDENTIFIED BY [PASSWORD] "newpassword"];



 2.SET PASSWORD FOR



SET PASSWORD FOR 
    'username'@'hostname'=PASSWORD("newpassword");



 *当通过普通用户账户登录到MySQL服务器后,可以通过SET命令修改自己的密码。



SET PASSWORD=PASSWORD("newpassword");



  3.UPDATE



UPDATE mysql.user SET password=PASSWORD("newpassword")
    WHERE user="username" AND host="localhost";



 

 16.2.5 删除普通用户账号

 1.DROP USER



DROP USER user1[,user2] ...



 2.DELETE FROM



DELETE FROM mysql.user
    WHERE user="username" AND host="localhost";



 

16.3 权限管理

 16.3.1 对用户进行授权



GRANT priv_type [(column_list)] ON database.table
    TO user [IDENTIFIED BY [PASSWORD] 'password']
    [,user [IDENTIFIED BY [PASSWORD] 'password']]
    ...
    WITH with_option[with_option]



 with_option参数取值:

  • GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
  • MAX_QUERIES_PER_HOUR count:设置每小时可以允许执行count次查询;
  • MAX_UPDATES_PER_HOUR count:设置每小时可以允许执行count次更新;
  • MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立count个连接;
  • MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的count个连接数;

 

 16.3.2 查看用户所拥有权限



SHOW GRANTS FOR 'username'@'localhost' \G



 

 16.3.3 收回用户所拥有权限



REVOKE priv_type[(column_list)] ON database.table
    FROM user1 [IDENTIFIED BY[PASSWORD] 'password']
    [,user2 [IDENTIFIED BY[PASSWORD] 'password']]
    ...



 收回全部权限:



REVOKE ALL PRIVILEGES,GRANT OPTION
    FROM user1 [IDENTIFIED BY[PASSWORD] 'password']
    [,user2 [IDENTIFIED BY[PASSWORD] 'password']]
    ...