GRANT和REVOKE语句
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 ONdb_name.*和REVOKE ALL ONdb_name.*只授予和撤销数据库权限。
mysql中delete语句
·        表层级
表权限适⽤于⼀个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ONdb_name.tbl_name和REVOKE ALL ONdb_name.tbl_name只授予和撤销表权限。
·        列层级
列权限适⽤于⼀个给定表中的单⼀列。这些权限存储在lumns_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
允许使⽤CREATE TEMPORARY TABLE
TEMPORARY
TABLES
CREATE USER允许使⽤CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW允许使⽤CREATE VIEW
DELETE允许使⽤DELETE
DROP允许使⽤DROP TABLE
EXECUTE允许⽤户运⾏已存储的⼦程序
FILE允许使⽤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
SHOW DATABASES显⽰所有数据库
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@'%.v'适⽤于在v域中的任何主机的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的匿名⽤户帐户会被使⽤。
您可以通过执⾏以下查询来确定是否这适合于您。以下查询列举了所有匿名⽤户:
mysql>SELECT Host, User FROM mysql.user WHERE User='';
如果您想要删除本地匿名⽤户账户,以避免出现刚才谈到的问题,则需使⽤以下语句:
mysql>DELETE FROM mysql.user WHERE Host='localhost' AND User='';
mysql>FLUSH PRIVILEGES;
GRANT⽀持最长为60个字符的hostnames。数据库、表、列和⼦程序名称最长可为64个字符。Usernames最长可为16个字符。 注释:不能通过更改mysql.user表来改变usernames的允许长度。如果试图这么做,会导致出现不可预见的问题,可能会造成⽤户⽆法登录MySQL服务器。除了采⽤由My
SQL公司提供的⽤于升级MySQL服务器的mysql_fix_privilege_tables原稿之外,请您不要以任何⽅式变更授权表。
对于表或列的权限是作为各个权限层级的逻辑OR权限被附加形成的。例如,如果mysql.user表指定⼀个⽤户拥有全局SELECT权限,则该权限不能被数据库、表或列层级的登录项定义。
可以按下列⽅法计算列权限:
global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
在多数情况下,您只在⼀个权限层级下向⽤户授予权利,所以寿命通常不是那么复杂。有关权限检查规程的细节,请参见5.7节,“MySQL 访问权限系统”。
如果您对⼀个在mysql.user表中不存在的username/hostname组合授予权限,则增加⼀个登录项并保
持在此处,直到使⽤DELETE语句删除为⽌。换句话说,GRANT可以创建⽤户表登录项,但是REVOKE不会取消它们;您必须使⽤DROP USER或DELETE明确地操作。
如果创建了⼀个新的⽤户,或者如果您拥有全局授权权限,则⽤户密码被设置为由IDENTIFIED BY⼦句指定的密码(如果给定了⼀个)。如果⽤户已拥有了⼀个密码,则此密码被新密码替代。
警告:如果您创建了⼀个新⽤户,但是不指定IDENTIFIED BY⼦句,则⽤户没有 密码。这是很不安全的。不过,您可以启⽤
NO_AUTO_CREATE_USER SQL模式,来防⽌GRANT创建⼀个新⽤户(否则GRANT会这么做),除⾮给定了IDENTIFIED BY来为新⽤户提供⼀个密码。
使⽤SET PASSWORD语句也可以设置密码。请参见13.5.1.5节,“SET PASSWORD语法”。
在IDENTIFIED BY⼦句中,密码应被作为⽂字密码只被给定。没有必要使⽤PASSWORD()函数,因为该函数⽤于SET PASSWORD语句。例如:
GRANT ... IDENTIFIED BY 'mypass';
如果您不想以明⽩的⽂字发送密码,并且您知道PASSWORD()返回给密码的混编值,则您可以指定混编值,前⾯加⼊关键词PASSWORD:
GRANT ...
IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
在⼀个C程序中,您可以通过使⽤make_scrambled_password()C API函数得到混编值。
如果您为⼀个数据库授予权限,则在mysql.db表中,会根据需要创建登录项。如果使⽤REVOKE删除了所有的数据库权限,则本登录项被删除。
如果⼀个⽤户不拥有表权限,则当⽤户申请表清单时(例如,使⽤SHOW TABLES语句),表名称不显⽰。
SHOW DATABASES权限允许账户通过发布SHOW DATABASE语句来观看数据名称。不拥有此权限的账户只能看到他们拥有部分权限的数据库,并且如果使⽤--skip-show-database选项启动服务器,则根本不能使⽤本语句。
WITH GRANT OPTION⼦句给予⽤户能⼒,可以在指定的权限层级,向其它⽤户给定其拥有的任何权限。您应该留⼼您给予了谁GRANT OPTION权限,因为拥有不同权限的两个⽤户可以联合使⽤权限!
您不能向其它⽤户授予您⾃⼰没有的权限;GRANT OPTION权限只允许您赋予您⾃⼰拥有的权限。
要注意,当您在某个特定权限层级向⼀个⽤户授予GRANT OPTION权限时,⽤户拥有的该层级的任何权限(或未来将被给定的权限)也可以由该⽤户授予。假设您向⼀个⽤户赋予了数据库INSERT权限。如果您然后赋予数据库SELECT权限,并指定了WITH GRANT OPTION,则该⽤户不仅可以向其它⽤户给予SELECT权限,还可以给予INSERT。如果您然后向⽤户授予数据库UPDATE权限,则⽤户可以授予INSERT, SELECT和UPDATE。
您不应该向⼀个常规⽤户授予ALTER权限。如果您这么做,则该⽤户可以尝试通过对表重新命名来破坏授权系统!
TheMAX_QUERIES_PER_HOUR count,MAX_UPDATES_PER_HOUR count, andMAX_CONNECTIONS_PER_HOUR count options limit the number of queries, updates, and logins a user can perform during any given one-hour period. If count is0(the default), this means that there is no limitation for that
user.    MAX_QUERIES_PER_HOUR count,MAX_UPDATES_PER_HOUR count和MAX_CONNECTIONS_PER_HOUR count选项限制了在任何给定的⼀⼩时期间,⽤户可以执⾏的查询、更新和登录的数⽬。如果count是0(默认值),这意味着,对该⽤户没有限制。
MAX_USER_CONNECTIONS count选项限制了账户可以同时进⾏的连接的最⼤数⽬。如果count是0
(默认值),则
max_user_connections系统可以决定该 账户同时连接的数⽬。
注释:要对⼀个原有的⽤户指定任何这类资源限制型选项,同时⼜不影响原有的权限,需使⽤GRANT USAGE ON *.* ... WITH MAX_...。见5.8.4节,“限制账户资源”。
除了根据username和密码进⾏常规鉴定外,MySQL还可以检查X509证明属性。要为MySQL账户指定与SSL有关的选项,需使⽤GRANT语句的REQUIRE⼦句。(要了解有关在MySQL中使⽤SSL的背景信息,请参见5.8.7节,“使⽤安全连接”。)
对于⼀个给定的账户,有多种可能性可以限制连接类型:
·        如果账户没有SSL或X509要求,并且如果username和 密码是有效的,则允许不加密连接。但是,如果客户端有正确的证明和关键⽂件,则根据客户端的选择,也可以使⽤加密连接。
·        REQUIRE SSL选项⽤于告知服务器,对于该账户只允许SSL加密连接。注意,如果有允许任何⾮SSL连接的访问控制记录,则本选项可以被忽略。
·              mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
·                      ->IDENTIFIED BY 'goodsecret' REQUIRE SSL;
·        REQUIRE X509意味着客户端必须拥有⼀个有效证明,除⾮不需要确切的证明、发布者和主题。唯⼀的要求是,应可以使⽤CA证明其中之⼀来验证签名。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。