轉載請說明出處:博客園--邦邦醬好 http://www.cnblogs.com/bangbangjiang/p/3566388.html
通常我們會使用sqlyog等圖形化管理MYSQL數據庫的工具來管理mysql上的數據。當很多人同時通過sqlyog來訪問數據庫時,我們就需要創建不同的用戶賬戶來分配不同的權限。
比如在某些游戲測試中,策划需要對配置庫擁有修改的權限,對玩家數據庫只能擁有查詢的權限;測試人員對配置庫只能有查詢的權限,對玩家數據庫擁有修改的權限;開發對配置庫和玩家數據庫都要有查詢,修改的權限。當然了,這些權限需要看整個游戲的架構是怎么處理的再來決定權限。
那么我們先來學學用戶賬號設置的一些問題。
一.創建賬戶
(注意:創建前需要先進入mysql數據庫中,"use mysql")
語法是這樣的:GRANT privileges(columns) ON databases_name.tables TO user_name@host IDENTIFIED BY password WITH GRANT OPTION;
1.privileges:授予用戶的權限。它包括下面幾項(更多的權限可以查看mysql數據庫下的user表的列):
Alter (修改表和索引 )
2.columns:權限運用的列,它是可選的,並且你只能設置列特定的權限。如果命令有多於一個列,應該用逗號分開它們;
3.databases_name:權限運用的級別。權限可以是全局的(適用於所有數據庫和所有表)、特定數據庫(適用於一個數據庫中的所有表)或特定表的。
4.user_name:權限授予的用戶,它由一個用戶名和主機名組成(如test@localhost,mm@192.168.0.122)。在MySQL中,你不僅指定誰能連接,還有從哪里連接。這允許你讓兩個同名用戶從不同地方連接。 MySQL讓你區分他們,並彼此獨立地賦予權限。MySQL中的一個用戶名就是你連接服務器時指定的用戶名,該名字不必與你的Unix登錄名或 Windows名聯系起來。缺省地,如果你不明確指定一個名字,客戶程序將使用你的登錄名作為MySQL用戶名。這只是一個約定。你可以在授權表中將該名字改為nobody,然后以nobody連接執行需要超級用戶權限的操作。
5.password:賦予用戶的口令,它是可選的。如果你對新用戶沒有指定IDENTIFIED BY子句,該用戶不賦給口令(不安全)。對現有用戶,任何你指定的口令將代替老口令。如果你不指定口令,老口令保持不變,當你用IDENTIFIED BY時,口令字符串用改用口令的字面含義,GRANT將為你編碼口令,不要你用SET PASSWORD 那樣使用password()函數。
6.WITH GRANT OPTION:這是可選的,寫上它就是允許你所創建的這個用戶把他擁有的那些權限授給其他的用戶。可以用於數據庫、表和保存的程序
下面來創建一個名為tester,密碼為123,並且只能對peizhi庫進行查詢操作的賬戶:
mysql> grant select on peizhi.* to tester@localhost identified by "123" with grant option;
這樣你就可以使用賬號tester,密碼123來登陸peizhi庫了:

(登陸之后你會發現tester用戶只能看到peizhi這個數據庫,其他庫是看不到的,root用戶卻可以看到全部的數據庫。)
如果tester用戶試圖修改peizhi庫里的數據,sqlyog就會提示:

它告訴你,你沒有權限修改表。
具體需要授予什么權限就要根據實際情況判斷了。
當我們grant之后,打開mysql庫下的user表就會發現多了一行記錄:

二.刪除
(1)取消一個用戶的權限,可以使用revoke語句:REVOKE privileges(columns) ON databases_name.tables FROM user_name@host;
可以僅取消部分權限,它只刪除權限,不刪除用戶,只要在user表中有這個用戶的記錄,即使權限都沒了,這個用戶仍然可以連接服務器。
(2)刪除一個用戶:手動地修改(使用INSERT、UPDATE或DELETE等等)授權表(user表),如:delete from user where user="tester";刪除了tester這個賬戶,你應該執行 flush privileges(也有可能是mysqladmin flush-privileges或mysqladmin reload)告訴服務器再裝載授權表,否則你的更改將不會生效,除非你重啟服務器。
更改無效的意思是:tester這個用戶還是能夠使用sqlyog登陸數據庫進行操作,只有flush之后,這個用戶才會真正失效,無法訪問數據庫。
三.討論幾個問題
1.訪問控制:誰能連接,從哪里連接
當你試圖連接MySQL服務器時,服務器基於你的身份以及你是否能通過供應正確的密碼驗證身份來接受或拒絕連接。如果不是,服務器完全拒絕你的訪問。身份基於2個信息:(1)你從哪個主機進行連接,對應於user表的host字段;(2)你的mysql用戶名,對應於user表的name字段
它們是這句“GRANT privileges(columns) ON databases_name.tables TO user_name@host IDENTIFIED BY password;”;里的“user_name@host”
身份檢查使用3個user表(Host, User和Password)范圍列執行,服務器只有在user表記錄的Host和User列匹配客戶端主機名和用戶名並且提供了正確的密碼時才接受連接。
host可以有很多種描述:
(1)允許任何主機以max的用戶名進行連接:%(通配符),比如:max@% (它等價於max)。這是最簡單的建立用戶方式,但是也是最不安全的。
(2)允許一個受限的主機集合以max的用戶名進行連接,比如:max@%.snake.net,從snake.net域的任何主機。
(3)允許某個IP地址的用戶以max的用戶名進行連接,比如:
max@192.168.128.5(特定主機),
max@192.168.128.%(C類子網),
max@192.168.128.0/15(15位網絡號並匹配具有192.168.128頭的IP地址)
2.權限控制
(1)對用戶:WITH GRANT OPTION子句允許你把訪問授權的權利授予另一個用戶。要注意,擁有GRANT權限的兩個用戶可以彼此授權。如果你只給予了第一個用戶Select權 限,而另一個用戶有GRANT加上Select權限,那么第二個用戶可以是第一個用戶更“強大”。
(2)對數據庫:
全局權限是最強大的,因為它們適用於任何數據庫。
“GRANT privileges(columns) ON databases_name.tables TO user_name@host IDENTIFIED BY password;“里的databases_name設為:*.*即可。
僅對某個庫:databases_name.tables設為:database_name.*
僅對某個表的某個列:GRANT Select ON peizhi.member TO tester@localhost INDETIFIED BY "123";
更多的資料可以參閱mysql的使用手冊:訪問權限系統。
