lampabc.com,lamp学习本应更简单, 互帮 互助 共享 ~~~

简明MySQL——用户、权限管理

grant 权限1 [指定的列],权限2 [指定的列],...
on [TABLE|FUNCTION|PROCEDURE] 表/ 数据库.表/ */ *.*
to 用户1,用户2
[with grant option 选项,表示允许用户向别人授予自己所拥有的权限
[max_queries_per_hour n] 指定每个用户每小时执行的查询数量
[max_updates_per_hour n指定每个用户每小时执行的更新数量]
[max_connections_per_hour n]指定每个用户每小时执行的连接数量
]

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITH with_option [with_option] ...]

object_type =
TABLE
| FUNCTION
| PROCEDURE

with_option =
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...

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


GRANTT 和 REVOKE 命令分别用来授予和取消用户的权限,分有4个级别:全局、数据库、表、列

全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user中。GRANT/REVOKE ALL ON *.*只授予和撤销全局权限。

数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.dbmysql.host表中。GRANT/REVOKE ALL ON db_name.*只授予和撤销数据库权限。

表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT/REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。

列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。


show grants  显示用户拥有什么权限

MySQL允许您对不存在的数据库目标授予权限。在此情况下,将被授予的权限必须包括CREATE权限。
当您取消一个表或数据库时,MySQL不会自动撤销任何权限。但是,如果您取消一个子程序,则被赋予该子程序的所有子程序层级的权限都被撤销。

当在GRANT语句中指定数据库名称时,允许使用‘_’和‘%’通配符。这意味着,如果您想要使用‘_’字符作为一个数据库名称的一部分,您应该在GRANT语句中指定它为‘\_’,以防止用户可以访问其它符合此通配符格式的数据库;例如,GRANT ... ON `foo\_bar`.* TO ...。

MySQL支持以user_name@host_name的形式指定user值。如果一个user_name或host_name与一个不加引号的标识符一样是合法的,那么您不需要对它加引号。不过,要指定一个包含特殊字符(如‘-’)的user_name字符串,或一个包含特殊字符或通配字符(如‘%’),则引号是必要的;例如,'test-user'@'test-hostname'。分别对username和hostname加引号。

一些管理用户常用的命令,如下:

-- 添加用户
-- 5.7之前
INSERT INTO mysql.user(HOST,USER,PASSWORD) VALUES('%','username',PASSWORD('password'));  
-- 5.7及之后
CREATE USER 'test2'@'%' IDENTIFIED  BY '123456';   
FLUSH PRIVILEGES; 

-- 创建数据库
CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci
 -- 赋予权限
GRANT ALL PRIVILEGES ON `stj_demo`.* TO username@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
-- 修改密码
UPDATE `mysql`.`user` SET `Password` = PASSWORD('new_pwd') WHERE `user`.`Host` = '127.0.0.1' AND `user`.`User` = 'username';
-- 收回权限
REVOKE ALL PRIVILEGES ON `stj_demo`.* FROM username@'%';
-- 删除用户
DROP USER username@'%';