日期:2014-05-16  浏览次数:20894 次

mysql 语法入门 6

GRANTREVOKE句法

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {tbl_name | * | *.* | db_name.*}
    TO user_name [IDENTIFIED BY 'password']
        [, user_name [IDENTIFIED BY 'password'] ...]
    [WITH GRANT OPTION]

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

GRANTMySQL 3.22.11或以后版本中实现。对于更早MySQL版本,GRANT语句不做任何事情。

GRANTREVOKE命令允许系统主管在4个权限级别上授权和撤回赋予MySQL用户的权利:

全局级别
全局权限作用于一个给定服务器上的所有数据库。这些权限存储在mysql.user表中。
数据库级别
数据库权限作用于一个给定数据库的所有表。这些权限存储在mysql.dbmysql.host表中。
表级别
表权限作用于一个给定表的所有列。这些权限存储在mysql.tables_priv表中。
列级别
列权限作用于在一个给定表的单个列。这些权限存储在mysql.columns_priv表中。

对于GRANT如何工作的例子,见6.11 为MySQL增加新的用户权限。

对于GRANTREVOKE语句,priv_type可以指定下列的任何一个:

ALL PRIVILEGES      FILE                RELOAD
ALTER               INDEX               SELECT
CREATE              INSERT              SHUTDOWN
DELETE              PROCESS             UPDATE
DROP                REFERENCES          USAGE

ALLALL PRIVILEGES的一个同义词,REFERENCES还没被实现,USAGE当前是“没有权限”的一个同义词。它能用在你想要创建一个没有权限用户的时候。

为了从一个用户撤回grant的权限,使用GRANT OPTION的一个priv_type值:

REVOKE GRANT OPTION ON ... FROM ...;

对于表,你能指定的唯一priv_type值是SELECTINSERTUPDATEDELETECREATEDROPGRANTINDEXALTER

对于列,你能指定的唯一priv_type值是(即,当你使用一个column_list子句时)是SELECTINSERTUPDATE

你能通过使用ON *.*语法设置全局权限,你能通过使用ON db_name.*语法设置数据库权限。如果你指定ON *并且你有一个当前数据库,你将为该数据库设置权限。(警告:如果你指定ON *而你有一个当前数据库,你将影响全局权限!)

为了容纳对任意主机的用户授予的权利,MySQL支持以user@host格式指定user_name值。如果你想要指定一个特殊字符的一个user字符串(例如“-”),或一个包含特殊字符或通配符的host字符串(例如“%”),你可以用括号括起能用户或主机名字 (例如,'test-user'@'test-hostname')。

你能在主机名中指定通配符。例如,user@"%.loc.gov"适用于在loc.gov域中任何主机的user,并且user@"144.155.166.%"适用于在144.155.166类 C 子网中任何主机的user

简单形式的useruser@"%"的一个同义词。注意:如果你允许匿名用户连接MySQL服务器(它是缺省的),你也应该增加所有本地用户如user@localhost,因为否则,当用户试图从本地机器上登录到MySQL服务器时,对于mysql.user表中的本地主机的匿名用户条目将被使用!匿名用户通过插入有User=''的条目到mysql.user表中来定义。通过执行这个查询,你可以检验它是否作用于你:

mysql> SELECT Host,User FROM mysql.user WHERE User='';

目前,GRANT仅支持最长60个字符的主机、表、数据库和列名。一个用户名字能最多到16个字符。

对与一个表或列的权限是由4个权限级别的逻辑或形成的。例如,如果mysql.user表指定一个用户有一个全局select权限,它不能被数据库、表或列的一个条目否认。

对于一个列的权限能如下计算:

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges

在大多数情况下,你只授予用户一个权限级别上的权限,因此现实通常不象上面所说的那样复杂。:) 权限检查过程的细节在6 MySQL 存取权限系统中给出。

如果你为一个在mysql.user表中不存在的用户/主机名组合授权,一个条目被增加并且保留直到用一个DELETE命令删除。换句话说,GRANT可以创建user表的条目,但是REVOKE将不删除;你必须明确地使用DELETE删除.

MySQL 3.22.12或以后,如果创建一个新用户或如果你有全局授予权限,用户的口令将被设置为由IDENTIFIED BY子句指定的口令,如果给出一个。如果用户已经有了一个口令,它被一个