说说MySQL权限
本文首發于個人微信公眾號《andyqian》,期待你的關注~
前言
??今天繼續MySQL系列文章,講講MySQL權限相關的內容。我們都知道,在寫系統的時候,都會有權限相關的服務,以達到權限控制的目的。以最簡單的權限菜單為例: 管理員擁有最大權限,可以查看系統下所有菜單。操作員只擁有部分菜單權限。同樣的,在MySQL數據庫中也有相應的權限管理。例如:數據庫連接權限,新增,修改,查詢權限等等。下面我們就一一揭曉MySQL權限的真實面貌。
授權方式
??在講 MySQL 權限之前,我們不得不先熟悉下MySQL中常見的兩種授權方式。
姑且稱為:授權法 和 改表法 吧。
1. 授權法
標準語法如下:
grant all on db_name.table_name to 'user_name'@'host_name';其中:
以設置root用戶允許遠程連接為例:
給 root 用戶設置該實例上所有數據庫的所有權限,且允許其通過任意主機連接該實例。則可以用下述語句表示:
grant all on *.* to 'root'@'%';2. 改表法
你一定很好奇,MySQL是如何判斷用戶是否有某數據庫的權限?是否有某表的權限?
其實呀,在MySQL中是有特定數據結構來存儲這部分信息的。我們可以按照下述步驟來找到它,甚至可以來修改它,以達到修改權限的目的。
以設置root用戶允許遠程連接為例:
use mysql;update user set host="%" where user="root";flush privileges;執行以上語句后,我們可以通過以下語檢查是否生效:
show grants for 'root'@'%';值得注意的是:
為了權限驗證時的高效性。MySQL在服務啟動時,就會將權限數據加載在內存中。因此,授權法 與 改表法 會有以下細微差異:
例如:
mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)連接權限
?? 通過上面的介紹,我們現在應該已經知道了MySQL中常見的授權方式。現在就從實際角度來用用。我們都知道在MySQL中默認是不允許root用戶遠程登錄的。我們通過以下命令修改即可:
grant all on *.* to 'root'@'%';??(其中: 將192.168.1修改成你想要IP段即可!)
表權限
??知道了連接權限,我們再來說說表權限。以幾種常見的場景為例:
當僅僅只設置只讀權限時,執行update命令會有如下錯誤信息:
mysql> update t_user set name="sansan",updated_at=now() where oid=1; ERROR 1142 (42000): UPDATE command denied to user 'andyqian'@'localhost' for table 't_user當僅僅只設置可讀,可寫,可修改權限時,執行drop命令會有如下錯誤信息:
mysql> drop table t_user; ERROR 1142 (42000): DROP command denied to user 'andyqian'@'%' for table 't_user列權限
??在某些場景下,我們需要將權限精確到列上。我們也可以使用 grant命令來實現。
撤銷權限
??有添加權限,肯定也少不了撤銷權限。其語法與grant基本一致。僅僅只是關鍵字不同
查看用戶權限
??上面說到,如果用戶執行沒有權限的命令時。則會顯示錯誤信息。為了避免這種情況發生。我們可以先通過以下命令來查看當前用戶擁有的權限。
命令: show grants for 'user_name'@'localhost'
其可以使用current_user()函數來表示當前登錄用戶。
例如:
mysql> show grants for current_user(); +-----------------------------------------------------------------------+ | Grants for andyqian@localhost | +-----------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'andyqian'@'localhost' | | GRANT SELECT, INSERT ON `customer`.`t_user` TO 'andyqian'@'localhost' | +-----------------------------------------------------------------------+ 2 rows in set (0.00 sec)最后
??有很多童鞋會覺得:數據庫管理,SQL優化,索引建立等等,都是DBA的事情。開發人員不需要了解。我認為這種認知是錯誤的,數據庫設計本身就是后端工程師工作職責的一部分。DBA 應該是設計的審核者,而不是建立者。
相關閱讀:
寫會MySQL索引
讀懂MySQL執行計劃
<center></center>
總結
- 上一篇: 敏捷项目管理三板斧
- 下一篇: mysql数据库引擎InnoDB和MyI