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