2.2 授予权限

  前面提到了grant命令,grant的语法看起来可是相当复杂的呐:

    GRANT

        priv_type [(column_list)]

          [, priv_type [(column_list)]] ...

        ON [object_type] priv_level

        TO user [IDENTIFIED BY [PASSWORD] ¨password¨]

            [, user [IDENTIFIED BY [PASSWORD] ¨password¨]] ...

        [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]

        [WITH with_option ...]

      加粗的几个子项说明如下:

    l object_type:

        TABLE

      | FUNCTION

      | PROCEDURE

    l priv_level:

        *

      | *.*

      | db_name.*

      | db_name.tbl_name

      | tbl_name

      | db_name.routine_name

    l ssl_option:

        SSL

      | X509

      | CIPHER ¨cipher¨

      | ISSUER ¨issuer¨

      | SUBJECT ¨subject¨

    l with_option:

        GRANT OPTION

      | MAX_QUERIES_PER_HOUR count

      | MAX_UPDATES_PER_HOUR count

      | MAX_CONNECTIONS_PER_HOUR count

      | MAX_USER_CONNECTIONS count

  priv_type最简单,但可选项最多,官方文档中专门列了个表很清晰:

权限类型

简要说明

ALL [PRIVILEGES]

Grant all privileges at specified access level except GRANT OPTION

ALTER

Enable use of ALTER TABLE

ALTER ROUTINE

Enable stored routines to be altered or dropped

CREATE

Enable database and table creation

CREATE ROUTINE

Enable stored routine creation

CREATE TEMPORARY TABLES

Enable use of CREATE TEMPORARY TABLE

CREATE USER

Enable use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES

CREATE VIEW

Enable views to be created or altered

DELETE

Enable use of DELETE

DROP

Enable databases, tables, and views to be dropped

EVENT

Enable use of events for the Event Scheduler

EXECUTE

Enable the user to execute stored routines

FILE

Enable the user to cause the server to read or write files

GRANT OPTION

Enable privileges to be granted to or removed from other accounts

INDEX

Enable indexes to be created or dropped

INSERT

Enable use of INSERT

LOCK TABLES

Enable use of LOCK TABLES on tables for which you have the SELECT privilege

PROCESS

Enable the user to see all processes with SHOW PROCESSLIST

REFERENCES

Not implemented

RELOAD

Enable use of FLUSH operations

REPLICATION CLIENT

Enable the user to ask where master or slave servers are

REPLICATION SLAVE

Enable replication slaves to read binary log events from the master

SELECT

Enable use of SELECT

SHOW DATABASES

Enable SHOW DATABASES to show all databases

SHOW VIEW

Enable use of SHOW CREATE VIEW

SHUTDOWN

Enable use of mysqladmin shutdown

SUPER

Enable use of other adminstrative operations such as CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin debug command

TRIGGER

Enable triggers to be created or dropped

UPDATE

Enable use of UPDATE

USAGE

Synonym for “no privileges

  括弧,权限说明的英文语法很简单,俺偷个懒,就不译成中文的。

  以上几段加一块基本上就是grant语句的语法,看起来呢是复杂了一点点,不过看不懂没关系,再说就算看懂了也不一定记的住,就像现在人人都知道要先感谢国家,但是人人也都明白不过说说而已(不过百万裸官在海外的亲戚们说这话时应该是真心的),关键还是得动真格的,得会用才行,三思争取后面多弄几个例子,让大家伙都搞明白这个事儿。

    提示:

    不使用grant语句,而通过insert,update方式修改字典表也是靠谱的!

  重点说一下with_option的几个选项:

  • GRANT OPTION:允许用户再将该权限授予其它用户;
  • MAX_QUERIES_PER_HOUR:允许用户每小时执行的查询语句数量;
  • MAX_UPDATES_PER_HOUR:允许用户每小时执行的更新语句数量;
  • MAX_CONNECTIONS_PER_HOUR:允许用户每小时连接的次数;
  • MAX_USER_CONNECTIONS:允许用户同时连接服务器的数量;

  这块的内容一看就是给用户设限制使的,我个人认为意义不大,不过简单了解一下也是有必要的,万一哪天对某用户看着不爽,DBA心里应该明白,还是有法子限制该用户能够使用的资源的。

  其它部分就先不多说了,何况这个事儿也不能说的太细,主要是太细的东西三思也不懂,不懂装懂这个事儿俺脸皮虽然已经很厚,但做这类事儿的时候表情总是不够自然,不过请童鞋们放心,俺一定会继续努力,争取早日成功复制那谁的成功,用俺的真诚蒙到别人,蒙到所有的人~~~

2.3 收回权限

  要收回用户权限,与之对应的命令是revoke,它的语法从定义上分为两种:

  • REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...     ON [object_type] priv_level FROM user [, user] ...
  • REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

  前者用来处理指定的权限,后者去掉所有权限。Revoke语法的子句定义与grant中同名子句定义一模一样,这里不再复述。

  如果想确定用户当前都拥有什么权限,可以使用show grants语句,例如,查看用户jss_grant@10.0.0.99都拥有哪些权限,执行语句如下:

    mysql> show grants for jss_grant@10.0.0.99;

    +------------------------------------------------------------------------------------------------------------------+

    | Grants for jss_grant@10.0.0.99                                                                                   |

    +------------------------------------------------------------------------------------------------------------------+

    | GRANT USAGE ON *.* TO ¨jss_grant¨@¨10.0.0.99¨ IDENTIFIED BY PASSWORD ¨*284578888014774CC4EF4C5C292F694CEDBB5457¨ |

    | GRANT SELECT ON `mysql`.`user` TO ¨jss_grant¨@¨10.0.0.99¨                                                        |

    +------------------------------------------------------------------------------------------------------------------+

    2 rows in set (0.00 sec)

  从上述返回的结果可以看到,用户jss_grant@10.0.0.99拥有两个权限,查询mysql.user表的查询,以及登录MySQL数据库的权限。一般用户只要创建,就会拥有usage on *.*的权限,该权限无法通过revoke语句收回,切记切记。

  尝试,收回jss_grant用户对mysql.user的select权限,操作如下:

    mysql> revoke select on mysql.user from jss_grant@10.0.0.99;

    Query OK, 0 rows affected (0.00 sec)

2.4 删除用户

  删除用户的语法非常简单:

    DROP USER user [, user] ...

  从语法上看与ORACLE有一点点不同,这个我感觉还是有必要提一下,比如ORACLE中的删除用户(或其它对象比如表空间),如果该用户下有别的对象,那么默认删除操作会失败,ORACLE提示需要先清理一下该用户下的对象,如果强制删除的话呢,它提供了一个CASCADE子句,附加该子句后就不再提示,即使存在关联对象也将自动将其删除。

  MySQL的删除用户语法中就不存在CASCADE的子句,为什么不存在呢,并不是MySQL对数据的保护不如ORACLE那么上心,而是由于最重要的一条与ORACLE不同的机制决定,MySQL数据库中的对象保存并不是依赖于用户,而是依赖于库(db),用户被删除没有任何关系,对象仍在,好好的保存在其所存储的数据库中,因此,MySQL数据库中的用户删了就删了,如果外部应用不使用该用户的话,那么我们可以认为该用户被删除无影响。即使发现真的删错了,该用户其实早就立志将一生奉献给镰刀斧头帮,并且作风过硬,对party和国家无限忠诚,party让咬谁就咬谁。想给它恢复身份的话也很简单,这不就是组织上一句话的事儿嘛,只要重新向mysql.user表重新插入记录(注册建档),并授予所需权限即可(授予官阶),至于底层数据的意见那是完全可以忽视的。

    提示:

    DROP USER不会自动中止已连接的用户会话,也就是说被删的用户如果在删前已经连接上了服务器,并且没有尚未中断,那它此时还能继续执行一定的操作,只是,它的身份已经变成了黑户。