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 在權限校驗過程中,只要找到匹配的權限之後,就不會再繼續往後查找是否還有匹配的權限信息,而直接完成校驗過程。