2019獨角獸企業重金招聘Python工程師標準>>>
因今天在分配數據庫權限的時候,同事反映賬戶不能使用函數,遂搜集資料總結了一番關于mysql用戶的權限分配。
MySQL 賦予用戶權限命令的簡單格式可概括為:
grant?權限?on?數據庫對象?to?用戶
權限列表:
ALTER: 修改表和索引。
CREATE: 創建數據庫和表。
DELETE: 刪除表中已有的記錄。
DROP: 拋棄(刪除)數據庫和表。
INDEX: 創建或拋棄索引。
INSERT: 向表中插入新行。
REFERENCE: 未用。
SELECT: 檢索表中的記錄。
UPDATE: 修改現存表記錄。
FILE: 讀或寫服務器上的文件。
PROCESS: 查看服務器中執行的線程信息或殺死線程。
RELOAD: 重載授權表或清空日志、主機緩存或表緩存。
SHUTDOWN: 關閉服務器。
ALL: 所有權限,ALL PRIVILEGES同義詞。
USAGE: 特殊的 "無權限" 權限。
用 戶賬戶包括 "username" 和 "host" 兩部分,后者表示該用戶被允許從何地接入。tom@'%' 表示任何地址,默認可以省略。還可以是 "tom@192.168.1.%"、"tom@%.abc.com" 等。數據庫格式為 db@table,可以是 "test.*" 或 "*.*",前者表示 test 數據庫的所有表,后者表示所有數據庫的所有表。
子句 "WITH GRANT OPTION" 表示該用戶可以為其他用戶分配權限。?
?
一、不同角色的權限分配
1)普通數據用戶
查詢、插入、更新、刪除 數據庫中所有表數據的權利。
grant?select?on?testdb.*?to?common_user@'%';grant?insert?on?testdb.*?to?common_user@'%';grant?update?on?testdb.*?to?common_user@'%';grant?delete?on?testdb.*?to?common_user@'%';
或者,用一條 MySQL 命令來替代:
grant?select,?insert,?update,?delete?on?testdb.*?to?common_user@'%'
2)數據庫開發人員
創建表、索引、視圖、存儲過程、函數。。。等權限。
grant 創建、修改、刪除 MySQL 數據表結構權限。
grant?create?on?testdb.*?to?developer@'%';grant?alter?on?testdb.*?to?developer@'%';grant?drop?on?testdb.*?to?developer@'%';
grant 操作 MySQL 外鍵權限。
grant?references?on?testdb.*?to?developer@'%';
grant 操作 MySQL 臨時表權限。
grant?create?temporary?tables?on?testdb.*?to?developer@'%';
grant 操作 MySQL 索引權限。
grant?index?on?testdb.*?to?developer@'%';
grant 操作 MySQL 視圖、查看視圖源代碼 權限。
grant?create?view?on?testdb.*?to?developer@'%';grant?show?view?on?testdb.*?to?developer@'%';
grant 操作 MySQL 存儲過程、函數 權限。
grant?create?routine?on?testdb.*?to?developer@'%'; ?--?now, can show procedure statusgrant?alter?routine?on?testdb.*?to?developer@'%'; ?--?now, you can drop a proceduregrant?execute?on?testdb.*?to?developer@'%';
3)普通 DBA
管理某個 MySQL 數據庫的權限。
grant?all?privileges?on?testdb?to?dba@'localhost';
其中,關鍵字 “privileges” 可以省略。
4)高級 DBA
管理 MySQL 中所有數據庫的權限。
grant?all?on?*.*?to?dba@'localhost';
?
二、不同層次的權限分配
MySQL grant 權限,分別可以作用在多個層次上。
1)作用在整個數據庫上
grant?select?on?*.*?to?dba@localhost;? --?dba 可以查詢 MySQL 中所有數據庫中的表。grant?all?on?*.*?to?dba@localhost;? --?dba 可以管理 MySQL 中的所有數據庫
2. 作用在單個數據庫上
grant?select?on?testdb.*?to?dba@localhost;? --?dba 可以查詢 testdb 中的表。
3. 作用在單個數據表上
grant?select,?insert,?update,?delete?on?testdb.orders?to?dba@localhost;
這里在給一個用戶授權多張表時,可以多次執行以上語句。例如:
grant?select(user_id,username)?on?smp.users?to?mo_user@'%'?identified?by?'123345';grant?select?on?smp.mo_sms?to?mo_user@'%'?identified?by?'123345';
4)作用在表中的列上
grant?select(id, se, rank)?on?testdb.apache_log?to?dba@localhost;
5)作用在存儲過程、函數上
grant?execute?on?procedure?testdb.pr_add?to?'dba'@'localhost';grant?execute?on?function?testdb.fn_add?to?'dba'@'localhost';
?
三、查看數據庫權限
1)查看當前用戶(自己)權限
show grants;
2)查看其他 MySQL 用戶權限
show grants?for?dba@localhost;
?
四、撤銷權限
撤銷已經賦予給 MySQL 用戶權限的權限。
revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from” 即可:
grant?all?on?*.*?to?dba@localhost;revoke?all?on?*.*?from?dba@localhost;
?
五、注意事項
grant、revoke 用戶權限分幾點注意事項
1)grant, revoke 用戶權限后,該用戶只有重新連接 MySQL 數據庫,權限才能生效;
2)如果想讓授權的用戶,也可以將這些權限 grant 給其他用戶,需要選項 “grant option“;
grant?select?on?testdb.*?to?dba@localhost?with?grant?option;
這個特性一般用不到。如果想要了解更多關于授權給其他用戶的權限,可參照權限控制問題。實際中,數據庫權限最好由 DBA 來統一管理。
?
六、錯誤處理
遇到 SELECT command denied to user '用戶名'@'主機名' for table '表名' 這種錯誤
解決方法是需要把后面的表名授權,即是要你授權核心數據庫也要。
我遇到的是SELECT command denied to user 'my'@'%' for table 'proc',是調用存儲過程的時候出現,原以為只要把指定的數據庫授權就行了,什么存儲過程、函數等都不用再管了,誰知道也要把數據庫mysql的proc表授權
?
七、數據庫授權表
mysql授權表共有5個:user、db、host、tables_priv和columns_priv。
授權表的內容有如下用途:
1)user表
user表列出可以連接服務器的用戶及其口令,并且它指定他們有哪種全局(超級用戶)權限。在user表啟用的任何權限均是全局權限,并適用于所有數據庫。例如,如果你啟用了DELETE權限,在這里列出的用戶可以從任何表中刪除記錄,所以在你這樣做之前要認真考慮。
?
2)db表
db表列出數據庫,而用戶有權限訪問它們。在這里指定的權限適用于一個數據庫中的所有表。
?
3)host表
host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響,所以,你可能發覺你根本不是用它。
?
4)tables_priv表
tables_priv表指定表級權限,在這里指定的一個權限適用于一個表的所有列。
?
5)columns_priv表
columns_priv表指定列級權限。這里指定的權限適用于一個表的特定列。
?
?
?
?
參考資料
1.?mysql數據庫有幾張授權表
2.?mysql 函數執行權限
3.?mysql 用戶及權限管理 小結