您的位置:首页 > 数据库 > MySQL

MySQL的账户与权限管理(GRANT与REVOKE的用法)

2009-12-16 17:51 811 查看
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] ...
GRANT和REVOKE语句允许系统管理员创建MySQL用户 账户,授予权限和撤销权限。MySQL账户信息存储在mysql数据库的表中。在第5章:数据库管理中对本数据库和访问控制系统进行了详尽的讨论。要了解更多详细信息,您应该查询此章。如果授权表拥有含有mixed-case数据库或表名称的权限记录,并且lower_case_table_names系统变量已设置,则不能使用REVOKE撤销权限,必须直接操纵授权表。(当lower_case_table_names已设置时,GRANT将不会创建此类记录,但是此类记录可能已经在设置变量之前被创建了。)授予的权限可以分为多个层级:·        全局层级全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。·        数据库层级数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。·        表层级表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。·        列层级列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。·        子程序层级CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。当后续目标是一个表、一个已存储的函数或一个已存储的过程时,object_type子句应被指定为TABLE、FUNCTION或PROCEDURE。当从旧版本的MySQL升级时,要使用本子句,您必须升级您的授权表。请参见2.10.2节,“升级授权表”。要使用GRANT或REVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。要撤销所有权限,需使用以下语法。此语法用于取消对于已命名的用户的所有全局层级、数据库层级、表层级和列层级的权限。
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user[, user] ...
要使用本REVOKE语法,您必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。对于GRANT和REVOKE语句,priv_type可以被指定为以下任何一种:
权限意义
ALL [PRIVILEGES]设置除GRANT OPTION之外的所有简单权限
ALTER允许使用ALTER TABLE
ALTER ROUTINE更改或取消已存储的子程序
CREATE允许使用CREATE TABLE
CREATE ROUTINE创建已存储的子程序
CREATE TEMPORARY TABLES允许使用CREATE TEMPORARY TABLE
CREATE USER允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW允许使用CREATE VIEW
DELETE允许使用DELETE
DROP允许使用DROP TABLE
EXECUTE允许用户运行已存储的子程序
FILE允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX允许使用CREATE INDEX和DROP INDEX
INSERT允许使用INSERT
LOCK TABLES允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS允许使用SHOW FULL PROCESSLIST
REFERENCES未被实施
RELOAD允许使用FLUSH
REPLICATION CLIENT允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT允许使用SELECT
SHOW DATABASESSHOW DATABASES显示所有数据库
SHOW VIEW允许使用SHOW CREATE VIEW
SHUTDOWN允许使用mysqladmin shutdown
SUPER允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE允许使用UPDATE
USAGE“无权限”的同义词
GRANT OPTION允许授予权限
当从旧版本的MySQL升级时,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE权限,您必须首先升级您的授权表。请参见2.10.2节,“升级授权表”。REFERENCES权限目前未被使用。当您想要创建一个没有权限的用户时,可以指定USAGE。使用SHOW GRANTS来确定帐户拥有什么权限。请参见13.5.4.10节,“SHOW GRANTS语法”。您可以通过使用ON *.*语法赋予全局权限,或通过使用ON db_name.*语法赋予数据库层级权限。如果您指定了ON *并且您已经选择了一个默认数据库,则权限被赋予到这个数据库中。(警告:如果您指定了ON *同时您没有选择一个默认数据库,则权限是全局的。)FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN和SUPER权限是管理性权限,只能进行全局授权(使用ON *.*语法)。其它权限可以被全局授权,或被赋予为其它层级。对于一个表,您可以指定的priv_type值只能是SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEX和ALTER。对于一个列(也就是,当您使用一个column_list子句时),您可以指定的priv_type值只能是SELECT, INSERT和UPDATE。在子程序层级,您可以指定的priv_type值只能是ALTER ROUTINE, EXECUTE和GRANT OPTION。CREATE ROUTINE不是一个子程序层级的权限,因为您必须拥有此权限,才能创建一个子程序。对于全局、数据库、表和子程序层级,GRANT ALL只能赋予在您正在授权的层级中存在的权限。例如,如果您使用GRANT ALL ON db_name.*,这是一个数据库层级语句,因此不会授予全局权限,如FILE等。MySQL允许您对不存在的数据库目标授予权限。在此情况下,将被授予的权限必须包括CREATE权限。这个性质是有意设计的,目的是允许数据库管理员为将在此后被创建的数据库目标预备用户 账户和权限。要点:当您取消一个表或数据库时,MySQL不会自动撤销任何权限。但是,如果您取消一个子程序,则被赋予该子程序的所有子程序层级的权限都被撤销。注意:GRANT语句用于在全局层级或数据库层级赋予权限。当在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加引号。您可以在hostname中指定通配符。例如user_name@'%.loc.gov'适用于在loc.gov域中的任何主机的user_name。同时user_name@'144.155.166.%'适用于144.155.166 C级子网中的任何主机的user_name。简单形式user_name是user_name@'%'的同义词。MySQL不支持usernames中的通配符。通过把带有User=''的登录项插入到mysql.user表中,或通过使用GRANT语句创建一个带有空名称的用户,可以定义匿名用户:
mysql> GRANT ALL ON test.* TO ''@'localhost' ...
当把带引号的值是,需使用反勾号(‘`’)为数据库、表、列和子程序名称加引号。使用单引号(‘'’)为hostnames、usernames和密码加引号。警告:如果您允许匿名用户连接到MySQL服务器,则您应该同时向所有本地用户授予user_name@localhost权限。否则,当有名称的用户试图从本地机器登录MySQL服务器时,mysql.user表中的用于localhost的匿名用户帐户会被使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息