6.1 账户管理
用户拥有一个登录账号是使用MySQL的基础,本节就将介绍如何设置MySQL用户账号及其权限。
6.1.1 创建新账号
首先来看如何新建一个MySQL用户账号,以及授予其权限。MySQL可以使用GRANT命令语句来完成这一功能:
GRANT privileges [(columns)] ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION
参数说明:
● privileges:分配给用户的权限。表6-1列出了可在GRANT语句中使用的权限,及其代表的意义:
表6-1 GRANT命令可授予的用户权限列表
● columns:所授予权限所适用的列,可选,用来设置列级专有权限。如果多于一个列,则可用逗号将其分开。
● what:所授予权限的应用范围,包括全局的(“*.*”,适用于所有数据库和所有的表)、数据库专有的(“db_name.*”,适用于某个数据库中的所有表),以及表(“db_name.table_name”,适用于某个表)专有的。如果想更进一步指定权限适用的列,可以通过COLUMNS子句指定。
● user:授予权限的用户,由用户名和主机名组成,如user_name@host_name。即不单指定谁进行连接,还要指定从网络的哪个位置进行连接,MySQL支持多个同名、从不同位置连接的用户。
● password:用户口令,可选。如果不给新用户指定IDENTIFIED BY子句,该用户不分配口令。对于已有的用户,指定的口令将替代旧口令;如果不指定新口令,用户的旧口令仍然保持不变。当使用IDENTIFIED BY时,GRANT会自动对口令进行加密。
● WITH GRANT OPTION:可选。如果包含该子句,该用户可以将自身的权限授予其他用户。
例如下面的命令将建立一个新的用户newuser1@localhost,并授予其在数据库student_course上所有操作权。
GRANT ALL ON student_course TO newuser1@localhost IDENTIFIED BY "password"
下面的命令授予newuser2@localhost在表student_course.students上的修改和删除权。
GRANT UPDATE DELETE ON student_course.students TO newuser2@localhost IDENTIFIED BY "password"
此时,如果使用newuser2登录,则只能看到student_course中的students表,如果试图查询表中的数据,则会报错:
%mysql -u newuser2 -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 to server version: 4.0.14-max-debug Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use student_course; Database changed mysql> show tables; +----------------------------------------+ | Tables_in_student_course | +----------------------------------------+ | students | +----------------------------------------+ 1 row in set (0.00 sec) mysql> select * from students; ERROR 1142: select command denied to user: 'newuser2@localhost' for table 'students' mysql>
若想再进一步细化权利范围,比如限定newuser2@localhost只能修改students表中的sname列,命令如下:
GRANT UPDATE(sname) ON student_course.students TO newuser2@localhost IDENTIFIED BY "password"
6.1.2 控制权限传递
上面介绍了如何创建一个用户及对其授权,可用WITH GRANT OPTION子句来控制权限的传递。例如,如果要让tom能从host1进行连接并管理sales数据库中所有表,并能够将这个权限传递给其他用户,应使用下列GRANT语句:
GRANT ALL ON student_courses.* TO tom@host1 IDENTIFIED BY "password" WITH GRANT OPTION
WITH GRANT OPTION子句允许将用户的权限授予给另一个用户,具有GRANT权限的两个用户可以相互授予自己的权限。如果只给一个用户授予SELECT权限,而给另一个用户除SELECT外还授予了其的权限,则第二个用户可以通过权限传递,使第一个用户更加“强大”。
6.1.3 取消权限和删除用户
为了收回某个用户的权限,可使用REVOKE语句。除了要用FROM替换TO,并且没有IDENTIFIED BY或WITH GRANT OPTION子句外,REVOKE的语法与GRANT语句非常相似:
REVOKE privileges (columns) ON what FROM user
其中,user为想要取消权限的用户名,privileges为想要取消的权限。例如,下面命令取消newuser1的所有权限:
mysql> REVOKE ALL ON student_course FROM newuser1@localhost;
REVOKE语句只删除权限,而不删除用户。即使取消了该用户的所有权限,用户仍然保留在系统(user表)中,这意味着该用户仍然可连接服务器。要想删除整个用户,必须用DELETE语句将该用户的记录从user表中直接删除:
DELETE FROM user WHERE User="username" and Host="hostname";
例如,下面命令删除newuser1@localhost用户:
mysql> use mysql Database changed mysql> DELETE FROM user -> WHERE User="newuser1" and Host="localhost"; mysql> FLUSH PRIVILEGES;
其中,DELETE语句删除该用户,FLUSH语句告诉服务器重新加载授权表。
6.1.4 了解MySQL的用户管理表
前面两节介绍了如何使用GRANT和REVOKE来管理用户和权限,作为MySQL管理员,应该更进一步了解MySQL的用户和权限管理表。MySQL把用户和权限信息保存在一个叫做mysql数据库中。该数据库至少包含了四个表,如表6-2所示。
表6-2 MySQL的用户权限表
GRANT和REVOKE语句影响上面四个表,当通过GRANT为用户授权时,MySQL在user表中为该用户创建一个项。
● 如果GRANT语句授予用户所有全局权限,则这些权限也记录在user表中。
● 如果GRANT语句只授予该用户数据库、表或列上的权限,则这些权限将被分别记录在db、tables_priv和columns_priv表中。
使用GRANT和REVOKE语句比直接修改授权表更容易。例如,下面的命令通过update命令直接修改user表,来更改root用户的密码:
% mysql -u root mysql % UPDATE user SET password=password('new_password') where user='root'; % FLUSH PRIVILEGES