這些信息會被頻繁訪問,所以會加載到內存里。如果手動修改了上述的表,就需要調用FLUSH PRIVILEGES來重新加載內存。 通過GRANT,REVOKE, CREATE USER, DROP USER來修改權限的話,就會自動更新內存里的權限信息,無需調用FLUSH PRIVILEGES
3、主要依靠這幾張表中存儲的權限信息。?
表名
代表的權限級別
mysql.User
global level
mysql.db
database level
mysql.table_priv
table level
mysql.column_priv
column level?
查詢權限的時候,也是從global -> db -> table ....level從大到小的順序查詢的。 也就是說,如果mysql.User表中有匹配到row,就會使用該行數據進行權限判斷,不會再繼續往后查找是否還有匹配的信息了。 如果查詢到多行,則會使用host信息最接近的,其余的都不會使用。
4、授予或者取消用戶的權限
1、global level權限
其作用域是所有數據庫中的所有對象。要授予global level權限,只需在執行GRANT命令時,用“*.*”指定適用范圍是Global即可GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO 'username'@'localhost'
@后面的是用戶的來訪主機
2、database level
其作用域是整個數據庫中所有的對象。database level相對于global level少了以下幾個權限。CREATE USER、FILE、PROCESS、RELOAD、REPLICATION CLIENT、REPLICATION SLAVE、SHOW DATABASES、SHUTDOWN、SUPER和USAGE。要授予database level權限,只需通過"database.*"即可
GRANT ALTER ON test.* TO 'username'@'localhost';獲取用戶在某個來訪主機下的訪問權限:
SHOW GRANTS FOR username@localhost也可以先通過USE一個數據庫,把作用域限定在該數據庫下,然后直接"*"即可。
USE test;
GRANT ALTER ON * TO 'username'@'localhost';給多個用戶授權,用,分隔即可。
grant create on perf.* to 'abc'@'localhost','def'@'localhost';username@host表示授予的用戶以及允許該用戶登錄的IP地址。其中Host有以下幾種類型:
localhost:只允許該用戶在本地登錄,不能遠程登錄。
%:允許在除本機之外的任何一臺機器遠程登錄。
192.168.52.32:具體的IP表示只允許該用戶從特定IP登錄。
3、table level
授予table level權限,通過"database.table"即可。
僅有ALTER,CREATE,DELETE,DROP,INDEX,SELECT,INSERT,UPDATE八種權限。grant INDEX ON `test`.`t1` TO 'abc'@'%.xxx.com';
把INDEX權限,在t1表的權限,授予abc用戶。該用戶的來訪主機必須是.xxx.com后綴的。
4、column level
方法如下:
grant select(id,value) ON test.t2 TO 'abc'@'localhost';
5、routine level
只有EXECUTE,ALTER ROUTINE兩種,針對procedure(存儲過程)和function(函數)
如:grant EXECUTE ON test.p1 to 'abc'@'localhost'; 注意: GRANT權限很特殊,擁有GRANT權限的用戶,可以將自身擁有的任何權限都授予其他用戶。 可以通過GRANT ALL語句,把某個level的所有可用權限授予某個用戶。 grant all on test.t5 to 'abc';grant all on perf.* to 'abc';show grants for 'abc'; 注意:即使內存里的權限信息更新了。 global level的權限也不會對已經連接上的session生效,而是對新建的連接生效。 db level的權限,只有在use db命令執行后才會生效 table、column的權限,有需使用權限的query請求時就會生效。
5、查看用戶權限
查看當前用戶自己的權限: show grants; 查看其他 MySQL 用戶權限: show grants for?dba@localhost;
6、撤銷用戶權限
使用revoke 命令來注銷用戶的權限,具體語法: 要撤銷所有權限,需使用以下語法。此語法用于取消對于已命名的用戶的所有全局層級、數據庫層級、表層級和列層級的權限。 REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] … 指定具體的權限: REVOKE SELECT FROM username@localhost 注意: 使用GRANT或REVOKE,操作者必須擁有GRANT OPTION權限. 2 使用REVOKE撤銷全部權限, 操作者必須擁有mysql數據庫的全局CREATE USER權限或UPDATE權限。