分类: Mysql/postgreSQL
2008-05-11 20:13:22
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
本语句用于设置事务隔离等级,用于下一个事务,或者用于当前会话。
在默认情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,用于从该点以后创建的所有新连接。原有的连接不受影响。要进行此操作,您需要SUPER权限。使用SESSION关键测可以设置默认事务等级,用于对当前连接执行的所有将来事务。
要了解对每个InnoDB事务隔离等级的描述,请参见15.2.10.3节,“InnoDB和TRANSACTION ISOLATION LEVEL”。InnoDB支持MySQL 5.1中的各个等级。默认的等级是REPEATABLE READ。
您可以使用--transaction-isolation选项,对mysqld设置初始的默认全局隔离等级。请参见5.3.1节,“mysqld命令行选项”。
对于InnoDB存储引擎,可以获得对XA事务的支持。MySQL XA的执行依据X/Open CAE文件Distributed Transaction Processing: The XA Specification。本文件由Open Group出版,可以从获取。在I.5节,“对XA事务的限制”对当前XA执行的限制进行了描述。
在客户端方面,没有特殊要求。连接MySQL服务器的XA接口由以XA关键词开头的SQL语句组成。MySQL客户端必须能发送SQL语句,并能理解XA语句接口的语义,但是它们不需要被链接到特定的MySQL客户库上。
当前,在MySQL连接器当中,MySQL连接器/J 5.0.0直接支持XA(也就是,通过一个可以控制XA SQL语句接口的等级接口)。
XA支持分布式的事务,具备能力,让多个独立的事务资源参加全局的事务。事务资源通常是RDBMSs,不过也可以是其它种类的资源。
一个全局事务会涉及到多个行动,这些行动本身是事务性的。不过,所有行动都必须作为一个群组成功完成,或者作为一个群组被回滚。实际上,这会延伸ACID性质,“提高等级”,这样,多个ACID事务就可以一起执行,相当于也拥有ACID性质的全局操作的组件。(但是,对于一个分布式事务,您必须使用SERAILIZABLE隔离等级,以实现ACID性质。对于一个非分布式事务,使用REPEATABLE READ就足够了。但是对于分布式事务,使用REPEATABLE READ是不够的。)
分布式事务的部分示例:
· 应用程序相当于一个把消息传递服务和RDBMS组合在一起的整合工具。应用程序可以确保,所有进行消息发送、回收和处理的事务(同时包含一个事务数据库)均在一个全局事务中发生。您可以把这看作是“事务电子邮件。”
· 应用程序执行的行动会涉及到不同数据库服务器,比如MySQL服务器和Oracle服务器(或多个MySQL服务器)。涉及到多个服务器的行动必须作为一个全局事务的一部分发生,而不是作为针对每个服务器的独立的本地事务发生。
· 银行把帐户信息保存在RDBMS中,并通过自动取款机(ATMs)分发和收取欠款。必须要确保ATM行动被正确地反映到帐户中,但是这不能只由RDBMS单独完成。全局事务管理器会整合ATM和数据库资源,以确保财务事务的整体一致性。
使用全局事务的应用程序涉及一个或多个资源管理器和一个事务管理器:
· 资源管理器(RM)用于提供通向事务资源的途径。数据库服务器是一种资源管理器。该管理器必须可以提交或 回滚由RM管理的事务。
· 事务管理器(TM)用于协调作为一个全局事务一部分的事务。TM与管理每个事务的RMs进行通讯。一个全局事务中各个单个事务均是全局事务的“分支”。全局事务和各分支通过一种命名方法进行标识。这种命名方法在后面进行讲述。
MySQL执行XA MySQL时,MySQL服务器相当于一个用于管理全局事务中的XA事务的资源管理器。与MySQL服务器连接的客户端相当于事务管理器。
要执行一个全局事务,必须知道涉及到了哪些组件,并且把每个组件引到一点,在此时,组件可以被提交或回滚时。根据每个组件报告的有关组件效能的内容,这些组件必须作为一个原子性群组全部提交或 回滚。即,要么所有的组件必须提交,要么所有的组件必须回滚。要管理一个全局事务,必须要考虑任何组件或连接网络可能会故障。
用于执行全局事务的过程使用两阶段提交(2PC),发生时间在由全局事务的分支进行的行动已经被执行之后。
1. 在第一阶段,所有的分支被预备好。即,它们被TM告知要准备提交。通常,这意味着用于管理分支的每个RM会记录对于被稳定保存的分支的行动。分支指示是否它们可以这么做。这些结果被用于第二阶段。
2. 在第二阶段,TM告知RMs是否要提交或 回滚。如果在预备分支时,所有的分支指示它们将能够提交,则所有的分支被告知要提交。如果在预备时,有任何分支指示它将不能提交,则所有分支被告知 回滚。
在有些情况下,一个全局事务可能会使用一阶段提交(1PC)。例如,当一个事务管理器发现,一个全局事务只由一个事务资源组成(即,单一分支),则该资源可以被告知同时进行预备和提交。
要在MySQL中执行XA事务,应使用以下语句:
XA {START|BEGIN} xid [JOIN|RESUME]
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER
对于XA START,JOIN和RESUME子句不被支持。
对于XA END,SUSPEND [FOR MIGRATE]子句不被支持。
每个XA语句以XA关键词为开头,多数语句要求一个xid值。 xid是一个XA事务标识符。它指示该语句适用于哪个事务。xid值由客户端提供,或由MySQL服务器生成。xid值包含一到三个部分:
xid: gtrid [, bqual [, formatID ]]
gtrid是一个全局事务标识符,bqual是一个分支限定符,formatID是一个数字,用于标识由gtrid和bqual值使用的格式。根据语法的表示,bqual和formatID是自选的。如果没有给定,默认的bqual值是''。如果没有给定,默认的fromatID值是1。
gtrid和bqual必须为字符串文字,每个的长度最多为64字节(不是字符)。gtrid和bqual可以用多种方法指定。您可以使用带引号的字符串('ab'),十六进制字符串(0x6162, X'ab'),或位值(b'nnnn')。
formatID是一个无符号的整数。
通过MySQL服务器的带下划线的XA支持子程序,gtrid和bqual值被理解为以字节为单位。但是,在包含XA语句的SQL语句正在被分析的同时,服务器会去操作一些特定的字符集。为了安全,把gtrid和bqual作为十六进制字符串写入。
通常,xid值由事务管理器生成。由一个TM生成的值必须与由其它TMs生成的值不同。一个给定的TM必须能识别自己的xid值。这些值位于由XA RECOVER语句返回的值清单中。
XA START xid用于启动一个带给定xid值的XA事务。每个XA事务必须有一个唯一的xid值,因此该值当前不能被其它的XA事务使用。使用gtrid和bqual值评估唯一性。所有下列的用于XA事务的XA语句必须使用与XA START语句中给定的相同的xid值进行指定。如果您使用这些语句,但是指定的xid值与部分原有的XA事务不对应的话,会发生错误。
一项或多项XA事务可以是同一个全局事务的一部分。在一个给定的全局事务中的所有XA事务必须在xid值中使用同样的gtrid值。出于这个原因,gtrid值必须为全局唯一的,这样,有关一个给定的XA事务是哪个全局事务的一部分的问题就不会含糊不清。对于一个全局事务中的每个XA事务,xid值中的bqual部分必须不一样。(bqual值应不一样,这个要求是当前执行MySQL XA的一个限制条件。这不是XA规约的一部分。)
对于在MySQL服务器上的处于PREPARED状态的XA事务,XA RECOVER语句会返回信息。(见13.4.7.2节,“XA事务状态”.。)输出包括一个行,该行用于服务器上的每个这类XA事务,不论是哪个客户端启动了它。
XA RECOVER输出行看上去像这样(例如,xid值包括'abc', 'def'和 7等部分):
mysql> XA RECOVER;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------+
| 7 | 3 | 3 | abcdef |
+----------+--------------+--------------+--------+
输出列有以下意义:
· formatID是事务xid的formatID部分
· gtrid_length是xid的gtrid部分的长度,以字节为单位
· bqual_length是xid的bqual部分的长度,以字节为单位
· data是xid的gtrid部分和bqual部分的串联
1. 使用XA START来启动一个XA事务,并把它放入ACTIVE状态。
2. 对于一个ACTIVE XA事务,发布构成事务的SQL语句,然后发布一个XA END语句。XA END把事务放入IDLE状态。
3. 对于一个IDLE XA事务,您可以发布一个XA PREPARE语句或一个XA COMMIT…ONE PHASE语句:
· XA PREPARE把事务放入PREPARED状态。在此点上的XA RECOVER语句将在其输出中包括事务的xid值,因为XA RECOVER会列出处于PREPARED状态的所有XA事务。
· XA COMMIT…ONE PHASE用于预备和提交事务。xid值将不会被XA RECOVER列出,因为事务终止。
4. 对于一个PREPARED XA事务,您可以发布一个XA COMMIT语句来提交和终止事务,或者发布XA ROLLBACK来回滚并终止事务。
下面是一个简单的XA事务,该事务把一行作为一个全局事务的一部分插入一个表中。
mysql> XA START 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO mytable (i) VALUES(10);
Query OK, 1 row affected (0.04 sec)
mysql> XA END 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA PREPARE 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA COMMIT 'xatest';
Query OK, 0 rows affected (0.00 sec)
根据一个给定的客户端连接的语境,XA事务和本地(非XA)事务互相排斥。举例说明,如果已经发布了XA START来开始一项XA事务,则本地事务不会被启动,直到XA事务已经被提交或被 回滚为止。相反的,如果已经使用START TRANSACTION启动一个本地事务,则XA语句不能被使用,直到该事务被提交或被 回滚为止。
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
CREATE USER用于创建新的MySQL账户。要使用CREATE USER,您必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。对于每个账户,CREATE USER会在没有权限的mysql.user表中创建一个新记录。如果 账户已经存在,则出现错误。
使用自选的IDENTIFIED BY子句,可以为账户给定一个密码。user值和 密码的给定方法和GRANT语句一样。特别是,要在纯文本中指定密码,需忽略PASSWORD关键词。要把 密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD。请参见13.5.1.3节,“GRANT和REVOKE语法”。
DROP USER user [, user] ...
DROP USER语句用于删除一个或多个MySQL账户。要使用DROP USER,您必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。使用与GRANT或REVOKE相同的格式为每个 账户命名;例如,'jeffrey'@'localhost'。 账户名称的用户和主机部分与用户表记录的User和Host列值相对应。
使用DROP USER,您可以取消一个账户和其权限,操作如下:
DROP USER user;
该语句可以删除来自所有授权表的帐户权限记录。
要点:DROP USER不能自动关闭任何打开的用户对话。而且,如果用户有打开的对话,此时取消用户,则命令不会生效,直到用户对话被关闭后才生效。一旦对话被关闭,用户也被取消,此用户再次试图登录时将会失败。这是有意设计的。
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 DATABASES |
SHOW 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的匿名用户帐户会被使用。
您可以通过执行以下查询来确定是否这适合于您。以下查询列举了所有匿名用户:
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服务器。除了采用由MySQL公司提供的用于升级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权限。如果您这么做,则该用户可以尝试通过对表重新命名来破坏授权系统!
The MAX_QUERIES_PER_HOUR count, MAX_UPDATES_PER_HOUR count, and MAX_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 is 0 (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_...。
除了根据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证明其中之一来验证签名。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
· REQUIRE ISSUER 'issuer'用于对连接尝试进行限定,客户端必须出示一个由CA’issuer’发布的有效的X509证明。如果客户端出示的证明是有效的,但是有一个不同的发布者,则服务器会拒绝连接。使用X509证明就意味着要加密,所以在这种情况下,SSL选项是不必要的。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
· O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';
注意,ISSUER值应被作为一个单一字符串输入。
· REQUIRE SUBJECT 'subject'用于对连接尝试进行限定,客户端必须出示一个包含主题subject的有效的X509证明。如果客户端出示的证明是有效的,但是有一个不同的主题,则服务器会拒绝连接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
· O=MySQL demo client certificate/
· CN=Tonu Samuel/Email=tonu@example.com';
注意,SUBJECT值应被作为一个单一字符串输入。
· 需要REQUIRE CIPHER 'cipher'来确认使用了密码和足够长度的关键字。如果使用了采用短型加密关键字的旧算法,SSL本身会比较脆弱。使用本选项,您可以要求使用特定的密码方法来许可一个连接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
SUBJECT, ISSUER和CIPHER选项可以在REQUIRE子句中结合,如下:
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com'
-> AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'
-> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
注意,SUBJECT和ISSUER值各自应被作为一个单一字符串输入。
在REQUIRE各选项之间,AND关键词是自选的。
选项的顺序无所谓,但是选项不能被指定两次。
当mysqld启动后,所有的权限被读入存储器中。要了解详细说明,请参见5.7.7节,“权限更改何时生效”。
注意,如果您正在使用表权限或列权限,即使只对一个用户使用,服务器也会对所有用户检查表权限和列权限,这会略微降低MySQL的速度。与此类似,如果您对某些用户限制查询、更新或连接的数目,则服务器必须监测这些值。
标准SQL版本和MySQL版本的GRANT之间的最大区别是:
· 在MySQL中,权限与hostname和username的组合有关,与 单一的username无关。
· 标准SQL不拥有全局层级或数据库层级权限,也不支持MySQL支持的所有权限类型。
· MySQL不支持标准SQL TRIGGER或UNDER权限。
· 标准SQL权限以一种分等级的方式进行组织。如果您取消一个用户,则用户被授予的所有权限都被撤销。在MySQL中,如果您使用DROP USER,也会如此。请参见13.5.1.2节,“DROP USER语法”。
· 在标准SQL中,当您取消一个表时,对一个表的所有权限会被撤销。在标准SQL中,当您撤销一个权限时,根据该权限被授予的所有权限也会被撤销。在MySQL中,只有使用明确的REVOKE语句,或通过操作存储在MySQL授权表中的值,才能取消权限。
· 在MySQL中,可以只对一个表中的部分列拥有INSERT权限。在此情况下,如果您忽略您不拥有INSERT权限的那些列,,您仍然可以对表执行INSERT语句。如果没有启用严格的SQL模式,则被忽略的列被设置为各自隐含的默认值。在严格模式下,如果某个被忽略的列没有默认值,则该语句被拒绝。5.3.2节,“SQL服务器模式”对严格模式进行了讨论。13.1.5节,“CREATE TABLE语法”对隐含默认值进行了讨论。
您不拥有INSERT权限的列被设置为各自的默认值。标准SQL要求您拥有所有列的INSERT权限。
在MySQL中,如果您只拥有一个表中的部分列的INSERT权限,同时,如果您从INSERT语句中忽略您不拥有权限的列,则您仍然可以对表执行INSERT语句;那些列将被设置为各自的默认值。在严格模式下(即当sql_mode='traditional'时,如果某些被忽略的列没有默认值,则INSERT语句将被拒绝。
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
RENAME USER语句用于对原有MySQL账户进行重命名。要使用RENAME USER,您必须拥有全局CREATE USER权限或mysql数据库UPDATE权限。如果旧 账户不存在或者新账户已存在,则会出现错误。old_user和new_user值的给定方法与GRANT语句一样。