MYSQL入门学习之二十八:MySQL权限系统简介

1、权限系统简介
        MySQL 的权限系统在实现上比较简单,相关权限信息主要存储在几个被称为grant tables 的系统表中,即: mysql.User,mysql.db,mysql.Host,mysql.tables_priv 和mysql.columns_priv。
        由于权限信息数据量比较小,而且访问又非常频繁,所以Mysql 在启动的时候,就会将所有的权限信息都Load 到内存中保存在几个特定的结构中。所以每次手工修改了权限相关的表之后,都需要执行“FLUSH PRIVILEGES”命令重新加载MySQL的权限信息。当然,如果通过GRANT,REVOKE 或者DROP USER 命令来修改相关权限,则不需要手工执行FLUSH PRIVILEGES 命令,因为通过GRANT,REVOKE 或者DROP USER ,CREATE USER命令所做的权限修改在修改系统表的同时也会更新内存结构中的权限信息。所以,建议一般情况下尽量使用GRANT,REVOKE,CREATE USER 以及DROPUSER 命令来进行用户和权限的变更操作,尽量减少直接修改grant tables 来实现用户和权限变更的操作。
2、权限授予与去除
        GRANT:为某个用户授权;
        REVOKE:去除某个用户已有的权限;
        另外还可以直接更新grant tables 系统表。
        当给某个用户授权的时候,不仅需要指定用户名,同时还要指定来访主机。如果在授权的时候仅指定用户名,则MySQL 会自动认为是对'username'@'%'授权。要去除某个用户的的权限同样也需要指定来访主机。
        查看某个用户目前拥有的权限,可以通过两个方式实现。一种方法是SHOW GRANTS FOR 'username'@'hostname';另一种方法是查询grant tables 里面的权限信息。
3、权限级别
        MySQL 中的权限分为五个级别,分别如下:
(1)、Global Level:
        Global Level 的权限控制又称为全局权限控制,所有权限信息都保存在mysql.user 表中。Global Level 的所有权限都是针对整个mysqld 的,对所有的数据库下的所有表及所有字段都有效。如果一个权限是以Global Level 来授予的,则会覆盖其他所有级别的相同权限设置。
        要授予Global Level 的权限,则只需要在执行GRANT 命令的时候,用“*.*”来指定适用范围是Global 的即可,当有多个权限需要授予的时候,也并不需要多次重复执行GRANT命令,只需要一次将所有需要的权限名称通过逗号(“,”)分隔开即可,如下:
        mysql > GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO 'def'@'localhost';
(2)、Database Level
        Database Level 是在Global Level 之下,其他三个Level 之上的权限级别,其作用域即为所指定整个数据库中的所有对象。
        与Global Level 的权限相比,Database Level 主要少了以下几个权限:CREATE USER,FILE,PROCESS,RELOAD,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES,SHUTDOWN,SUPER 和USAGE 这几个权限,没有增加任何权限。
        如果要授予Database Level 的权限,则可以有两种实现方式:
        一种方法是在执行GRANT 命令的时候,通过“database.*”来限定权限作用域为database 整个数据库,如下:
        mysql > GRANT ALTER ON test.* TO 'def'@'localhost';
        另一种方法是先通过USE 命令选定需要授权的数据库,然后通过“*”来限定作用域,这样授权的作用域实际上就是当前选定的整个数据库。
        mysql > USE test;
        mysql > GRANT DROP ON * TO 'def'@'localhost';
(3)、Table Level
        Database Level 之下就是Table Level 的权限了。
        Table Level 的权限作用范围是授权语句中所指定数据库的指定表。
        如可以通过如下语句给test 数据库的t1 表授权:
        root@localhost : test 12:02:15> GRANT INDEX ON test.t1 TO 'abc'@'%.jianzhaoyang.com';
        Table Level 的权限由于其作用域仅限于某个特定的表,所以权限种类也比较少,仅有ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT,UPDATE 这八种权限。
(4)、Column Level
        Column Level 的权限作用范围仅仅是某个表的指定的某个(或某些)列。
        由于Column Level 所针对的权限和Routine Level的权限作用域没有重合部分,所以不会有覆盖与被覆盖的关系。
        针对Column Level 级别的权限仅有INSERT,SELECT 和UPDATE 这三种。
        Column Level 的权限授权语句语法基本和Table Level 差不多,只是需要在权限名称后面将需要授权的列名列表通过括号括起来,如下:
        mysql > GRANT SELECT(id,value) ON test.t2 TO 'abc'@'%.jianzhaoyang.com';
        注意:当某个用户在向某个表插入(INSERT)数据的时候,如果该用户在该表中某列上面没有INSERT 权限,则该列的数据将以默认值填充。这一点和很多其他的数据库都有一些区别,是MySQL 自己在SQL 上面所做的扩展。
(5)、Routine Level
        Routine Level 的权限主要只有EXECUTE 和ALTER ROUTINE 两种,主要针对的对象是procedure 和function 这两种对象,在授予Routine Level 权限的时候,需要指定数据库和相关对象,如:
        mysql > GRANT EXECUTE ON test.p1 to 'abc'@'localhost';
        除了上面几类权限之外,还有一个非常特殊的权限GRANT,拥有GRANT 权限的用户可以将自身所拥有的任何权限全部授予其他任何用户,所以GRANT 权限是一个非常特殊也非常重要的权限。
        GRANT 权限的授予方式也和其他任何权限都不太一样,通常都是通过在执行GRANT授权语句的时候在最后添加WITH GRANT OPTION 子句达到授予GRANT 权限的目的。
        此外,还可以通过GRANT ALL 语句授予某个Level 的所有可用权限给某个用户,如:
        mysql > grant all on test.t5 to 'abc';
        mysql > grant all on perf.* to 'abc';
        在以上五个Level 的权限中,Table、Column 和Routine 三者在授权中所依赖(或者引用)的对象必须是已经存在的,而不像Database Level 的权限授予,可以在当前不存在该数据库的时候就完成授权。
        
参考:《MySQL性能调优与架构设计》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值