mysql 的權限體系介紹

mysql 的權限體系大致分爲5個層級:
全局層級

全局權限適用於一個給定服務器中的所有數據庫。這些權限存儲在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤銷全局權限。

數據庫層級
數據庫權限適用於一個給定數據庫中的所有目標。這些權限存儲在mysql.db和mysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤銷數據庫權限。

表層級
表權限適用於一個給定表中的所有列。這些權限存儲在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表權限。

列層級
列權限適用於一個給定表中的單一列。這些權限存儲在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。

子程序層級
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限適用於已存儲的子程序。這些權限可以被授予爲全局層級和數據庫層級。而且,除了CREATE ROUTINE外,這些權限可以被授予爲子程序層級,並存儲在mysql.procs_priv表中。

這些權限信息存儲在下面的系統表中:

mysql.user
mysql.db
mysql.host
mysql.table_priv
mysql.column_priv

當用戶連接進來,mysqld會通過上面的這些表對用戶權限進行驗證!

注意:

當後續目標是一個表、一個已存儲的函數或一個已存儲的過程時,object_type子句應被指定爲TABLE、FUNCTION或PROCEDURE。當從舊版本的MySQL升級時,要使用本子句,您必須升級您的授權表。請
我們可以用 CREATE USER 或 GRANT 創建用戶,後者還同時分配相關權限。而 REVOKE 則用於刪除用戶權限,DROP USER 刪除賬戶。

MySQL 賦予用戶權限命令語法爲:

grant 權限 on 數據庫對象 to 用戶;
grant 權限 on 數據庫對象 to 用戶 identified by “密碼”;
grant 權限 on 數據庫對象 to 用戶@”ip” identified by “密碼”

GRANT 語法:

GRANT privileges (columns)
ON what
TO user IDENTIFIED BY “password”
WITH GRANT OPTION;

privileges 列表:

* ALTER: 修改表和索引。
* CREATE: 創建數據庫和表。
* DELETE: 刪除表中已有的記錄。
* DROP: 拋棄(刪除)數據庫和表。
* INDEX: 創建或拋棄索引。
* INSERT: 向表中插入新行。
* REFERENCE:未使用。
* SELECT: 檢索表中的記錄。
* UPDATE: 修改現存表記錄。
* FILE: 讀或寫服務器上的文件。
* PROCESS: 查看服務器中執行的線程信息或殺死線程。
* RELOAD: 重載授權表或清空日誌、主機緩存或表緩存。
* SHUTDOWN: 關閉服務器。
* ALL: 所有權限,ALL PRIVILEGES同義詞。
* USAGE: 特殊的 “無權限” 權限。

user 賬戶包括 “username” 和 “host” 兩部分 即是username@host,後者表示該用戶被允許從何地接入。user@’%’表示用戶user可以從任何地址訪問本地的數據庫,默認可以省略。還可以是 “[email protected].%“、”user1@%.abc.com” 等。數據庫格式爲 db.table,可以是 “test.*” 或 “*.*”,前者表示 test 數據庫的所有表,後者表示所有數據庫的所有表。
子句 “WITH GRANT OPTION” 表示該用戶可以爲其他用戶分配權限。使用grant 命令創建用戶或者進行授權之後,需要使用flush privileges刷新MySQL的系統權限相關表,否則會出現拒絕訪問,或者重新啓動mysql服務器,來使新設置生效。當然後者並不是一種好想法!

比如:

一 grant普通數據用戶yangql402查詢、插入、更新、刪除 數據庫(test)中所有表數據的權利。
grant select, insert, update, delete on test.* to yangql402@’%’;
二 grant數據庫開發人員(yangql402),創建表、索引、視圖、存儲過程、函數。。。等權限。

grant創建、修改、刪除 MySQL 數據表結構權限。
grant create on test.* to yangql402@’10.250.7.225′;
grant alter  on test.* to yangql402@’10.250.7.225′;
grant drop   on test.* to yangql402@’10.250.7.225′;

grant 操作 MySQL 外鍵權限,官方文檔上說未使用!

grant references on test.* to yangql402@’10.250.7.225′;

grant 操作 MySQL 臨時表權限。

grant create temporary tables on test.* to yangql402@’10.250.7.225′;

grant 操作 MySQL 索引權限。

grant index on test.* to yangql402@’10.250.7.225′;

grant 操作 MySQL 視圖、查看視圖源代碼 權限。

grant create view on test.* to yangql402@’10.250.7.225′;
grant show   view on test.* to yangql402@’10.250.7.225′;

grant 操作 MySQL 存儲過程、函數 權限。

grant create routine on test.* to yangql402@’10.250.7.225′;
grant alter routine on test.* to yangql402@’10.250.7.225′;
grant execute        on test.* to yangql402@’10.250.7.225′;

三 grant 普通DBA管理某個MySQL數據庫(test)的權限。

grant all privileges on test to dba@’localhost’

其中,關鍵字 “privileges” 可以省略。
四 grant 高級 DBA 管理 MySQL 中所有數據庫的權限。

grant all on *.* to dba@’localhost’

五 MySQL grant 權限,分別可以作用在多個層次上。

a. grant 作用在整個 MySQL 服務器上:
grant select on *.* to dba@localhost; — dba 可以查詢 MySQL 中所有數據庫中的表。
grant all    on *.* to dba@localhost; — dba 可以管理 MySQL 中的所有數據庫

b. grant 作用在單個數據庫上:
grant select on test.* to dba@localhost; — dba 可以查詢 test 中的表。

c. grant 作用在單個數據表上:
grant select, insert, update, delete on test.yql8 to dba@localhost;

d. grant 作用在表中的列上:
grant select(id, se, rank) on test.yql8 to dba@localhost;

e. grant 作用在存儲過程、函數上:
grant execute on procedure test.yql8 to ‘dba’@’localhost’;
grant execute on function test.yql8 to ‘dba’@’localhost’;
六 查看用戶權限

查看當前用戶自己的權限:
show grants;

查看其他 MySQL 用戶權限:
show grants for dba@localhost;

七 撤銷用戶權限

使用revoke 命令來註銷用戶的權限,具體語法:

要撤銷所有權限,需使用以下語法。此語法用於取消對於已命名的用戶的所有全局層級、數據庫層級、表層級和列層級的權限。

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] …

也可以指定具體的權限比如:

REVOKE SELECT FROM yangql402@”10.250.7.249“;

注意:

1 使用GRANT或REVOKE,操作者必須擁有GRANT OPTION權限,並且您必須用於您正在授予或撤銷的權限。
2 使用REVOKE撤銷全部權限,操作者必須擁有mysql數據庫的全局CREATE USER權限或UPDATE權限。

八 刪除用戶:

DROP USER user;

其中user 賬戶包括 “username” 和 “host” 兩部分 即是username@host;如果創建的時候爲yangql@”10.250.7.225“,則刪除的時候必須使用

drop user yangql@”10.250.7.225“,否則會報錯!
mysql> drop user yangql402;
ERROR 1396 (HY000): Operation DROP USER failed for ‘yangql402′@’10.250.7.225′
mysql> drop user yangql402@’10.250.7.225′;
Query OK, 0 rows affected (0.01 sec)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章