创建新的用户
mysql> create user 'yhq'@'127.0.0.1'; Query OK, 0 rows affected (0.00 sec)mysql> show grants for 'yhq'@'127.0.0.1';
+-----------------------------------------+
| Grants for yhq@127.0.0.1 |
+-----------------------------------------+
| GRANT USAGE ON . TO 'yhq'@'127.0.0.1' |
+-----------------------------------------+
1 row in set (0.00 sec)
当成功创建用户账户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用 SHOW GRANTS FOR 语句来查询用户的权限。
注意:新创建的用户只有登录 MySQL 服务器的权限,没有任何其他权限,不能进行其他操作。
USAGE ON*.* 表示该用户对任何数据库和任何表都没有权限。
授予用户权限
GRANT <权限类型> ON <权限级别> TO <用户>格式: <用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令> [ WITH GRANT OPTION] | MAX_QUERIES_PER_HOUR <次数> | MAX_UPDATES_PER_HOUR <次数> | MAX_CONNECTIONS_PER_HOUR <次数> | MAX_USER_CONNECTIONS <次数>
grant all privileges on dbname.* to username@localhost identified by 'password';
<权限级别>
用于指定权限的级别。可以授予的权限有如下几组:
-
列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 student_name 列的值的权限。
-
表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
-
数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
-
用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。
对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:
-
*:表示当前数据库中的所有表。
-
*.*:表示所有数据库中的所有表。
-
db_name.*:表示某个数据库中的所有表,db_name 指定数据库名。
-
db_name.tbl_name:表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名。
-
tbl_name:表示某个表或视图,tbl_name 指定表名或视图名。
-
db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名。
-
TO 子句:用来设定用户口令,以及指定被赋予权限的用户 user。若在 TO 子句中给系统中存在的用户指定口令,则新密码会将原密码覆盖;如果权限被授予给一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句来创建这个用户,但同时必须为该用户指定口令。
<权限类型>
-
SELECT:表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。
-
INSERT:表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。
-
DELETE:表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。
-
UPDATE:表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。
-
REFERENCES:表示授予用户可以创建指向特定的数据库中的表外键的权限。
-
CREATE:表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。
-
ALTER:表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。
-
SHOW VIEW:表示授予用户可以查看特定数据库中已有视图的视图定义的权限。
-
CREATE ROUTINE:表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。
-
ALTER ROUTINE:表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。
-
INDEX:表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。
-
DROP:表示授予用户可以删除特定数据库中所有表和视图的权限。
-
CREATE TEMPORARY TABLES:表示授予用户可以在特定数据库中创建临时表的权限。
-
CREATE VIEW:表示授予用户可以在特定数据库中创建新的视图的权限。
-
EXECUTE ROUTINE:表示授予用户可以调用特定数据库的存储过程和存储函数的权限。
-
LOCK TABLES:表示授予用户可以锁定特定数据库的已有数据表的权限。
-
ALL 或 ALL PRIVILEGES:表示以上所有权限。
1) 授予表权限时,<权限类型>可以指定为以下值:
-
SELECT:授予用户可以使用 SELECT 语句进行访问特定表的权限。
-
INSERT:授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限。
-
DELETE:授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限。
-
DROP:授予用户可以删除数据表的权限。
-
UPDATE:授予用户可以使用 UPDATE 语句更新特定数据表的权限。
-
ALTER:授予用户可以使用 ALTER TABLE 语句修改数据表的权限。
-
REFERENCES:授予用户可以创建一个外键来参照特定数据表的权限。
-
CREATE:授予用户可以使用特定的名字创建一个数据表的权限。
-
INDEX:授予用户可以在表上定义索引的权限。
-
ALL 或 ALL PRIVILEGES:所有的权限名。
2) 授予列权限时,<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。
3) 最有效率的权限是用户权限。
授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:
-
CREATE USER:表示授予用户可以创建和删除新用户的权限。
-
SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。
【实例】使用 GRANT 语句创建一个新的用户 testUser,密码为 testPwd。用户 testUser 对所有的数据有查询、插入权限,并授予 GRANT 权限。输入的 SQL 语句和执行过程如下所示。
mysql> grant select,insert on *.* to 'testuser'@'localhost' identified by 'testPwd' with grant option; Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'testuser'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for testuser@localhost | +--------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT SELECT, INSERT ON *.* TO 'testuser'@'localhost' IDENTIFIED BY PASSWORD '*0FFBF8429EADB2A867BD3E4495469E7B78E7C2F2' WITH GRANT OPTION | +--------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
删除用户权限
1) 第一种:
REVOKE <权限类型> [ ( <列名> ) ] [ , <权限类型> [ ( <列名> ) ] ]…
ON <对象类型> <权限名> FROM <用户1> [ , <用户2> ]…
2) 第二种:
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user <用户1> [ , <用户2> ]…
-
REVOKE 语法和 GRANT 语句的语法格式相似,但具有相反的效果。
-
第一种语法格式用于回收某些特定的权限。
-
第二种语法格式用于回收特定用户的所有权限。
-
要使用 REVOKE 语句,必须拥有 MySQL 数据库的全局 CREATE USER 权限或 UPDATE 权限。
【实例】使用 REVOKE 语句取消用户 testUser 的插入权限,输入的 SQL 语句和执行过程如下所示。
mysql> revoke insert on *.* from 'testuser'@'localhost'; Query OK, 0 rows affected (0.00 sec)mysql> show grants for 'testuser'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for testuser@localhost |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON . TO 'testuser'@'localhost' IDENTIFIED BY PASSWORD '*0FFBF8429EADB2A867BD3E4495469E7B78E7C2F2' WITH GRANT OPTION |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)