Mysql权限系统总结
存储权限信息的几个grant tables的系统表。
mysql.user、mysql.db、mysql.Host、mysql.table_priv和mysql.column_priv。
Mysql在启动时,就将所有权限信息Load到内存中。FLUSH PRIVILEGES使权限生效。
权限授予与去除:
show grants for 'username'@'hostname'
权限级别:
MySQL权限分为五个级别:
Global Level:
又称为全局权限控制,所有权限信息都保存在mysql.user表中。针对整个mysqld有效。
grant select,update,delete,insert on *.* to 'def'@'localhost'
如果一个权限是以Global Level 来授予的,则会覆盖其他所有级别的相同权限设置。
Database Level:
作用域是所指定整个数据库中的所有对象。所有权限信息都保存在mysql.db表中
Database Level 主要以下几个权限:CREATE USER,FILE,PROCESS,RELOAD,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES,SHUTDOWN,SUPER 和USAGE 这几个权限
授予Database Level的权限:
grant alter on test.* to 'def'@'localhost';
show grants for def@localhost;
use test;
grant drop on * to 'def'@'localhost';
grant create on perf.* to 'abc'@'localhost','def'@'localhost';
show grants for def@localhost;
mysql.Host:
配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响
Table Level: 所有权限信息都保存在mysql.table_priv
table Level的权限作用范围是授权语句中所指定数据库的指定表。
Table Level的权限,仅有ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT, UPDATE 这八种权限。
grant index on test.t1 to 'abc'@'%.jianzhaoyang.com';
Column Level: 所有权限信息都保存在mysql.column_priv
Column Level的权限作用范围更新,仅仅是某个表的指定的某个列。
对Column Level 级别的权限仅有INSERT,SELECT 和UPDATE 这三种。
grant select(id,value) on test.t2 to 'abc'@'%.jianzhaoyang.com';
Rountine Level:
Rountine Level的权限主要有EXECUTE和Alter ROUTINE两种。
主要针对的对象是procedure 和function 这两种对象。
grant execute on test.p1 to 'abc'@'localhost';
grant all on test.t5 to 'abc';
对于Global Level 的权限信息的修改,仅仅只有更改之后新建连接才会用到,对于Database Level权限信息的修改只有当客户端执行了"use database_name"命了之后,才生效。
对于Table Level和Column Level的权限,则会在下一次需要使用到该权限的Query被请求的时候生效。
MySQL 在权限校验过程中,只要找到匹配的权限之后,就不会再继续往后查找是否还有匹配的权限信息,而直接完成校验过程。