2012-12-21 66 views
1

我有一個用戶'myuser'和兩個數據庫。 'db1'和'db2'。授予其他MySQL數據庫導致問題的權利

myuser」已經有權使用db1,我想給他用下面的查詢使用「db2」其他權限:

GRANT ALL ON db2.* TO 'myuser'@'localhost'; 

後,我跑了GRANT語句,「myuser」失去的連接到第一個數據庫'db1'

恐怕我使用了錯誤的主機名。我應該使用'%'代替'localhost'。 當我做:

select host from mysql.user where user = 'myuser'; 

現在我看到兩個主機記錄'%'和「localhost」該用戶

當我運行SHOW GRANT語句,我得到的權限不同的主機。 'localhost'和'%'。

mysql> SHOW GRANTS FOR 'myuser'@'localhost'; 
+----------------------------------------------------------------------+ 
| Grants for [email protected]          | 
+----------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'myuser'@'localhost'      | 
| GRANT ALL PRIVILEGES ON `beta_version`.* TO 'myuser'@'localhost' | 
+----------------------------------------------------------------------+ 

mysql> SHOW GRANTS FOR 'myuser'@'%'; 
+-----------------------------------------------------------------------------------------------------------+ 
| Grants for [email protected]%                     | 
+-----------------------------------------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'myuser'@'%' IDENTIFIED BY PASSWORD '*6ASDFASDFASDF...' 
| GRANT ALL PRIVILEGES ON `myuser`.* TO 'myuser'@'%'             
+-----------------------------------------------------------------------------------------------------------+ 

發生了什麼事導致 'myuser' 在我的PHP腳本,並在phpMyAdmin無法正常工作?

+0

['SHOW GRANTS'只顯示明確授予指定帳戶的權限。其他特權可能可用於該帳戶,但它們不顯示。](http://dev.mysql.com/doc/en/show-grants.html) – eggyal

回答

2

MySQL的雙方用戶名和主機標識用戶。當MySQL不在登錄時進行身份驗證,MySQL首先查找一個確切的m的主機名ATCH。如果找不到完全匹配,則會查找包含'%'通配符的主機。

當你做了GRANT ... TO [email protected],MySQL的創建新用戶(無密碼,因爲沒有在聲明中給出IDENTIFIED BY

然後發生了什麼,當你試圖從本地主機登錄爲myuser後,mysqld試圖找到一個與mysql.user表中的'myuser'@'localhost'匹配的條目,並且它找到它並且該會話獲得了分配給該用戶的權限

(爲了更精確一點,mysqld並沒有真正看待mysql.user表的內容,它真正查看內存結構的內容,當它是b時從表中填充它uilt。內存結構的重建由GRANT,REVOKE或FLUSH PRIVILEGES語句觸發。)

發生了什麼在添加新用戶之前,mysqld正在查找用戶和主機名的完全匹配,找到一個。但它確實找到了一個帶有'%'通配符的條目,所以它與之匹配,因此會話獲得了授予'myuser'@'%'用戶的所有特權。


兩個用戶'u'@'%''u'@'localhost'彼此分開且不同。特權必須分別授予每個用戶。授予'u'@'%'的任何特權僅適用於該用戶,不適用於'u'@'localhost'

+0

因此,它聽起來像我應該從MySQL刪除記錄'表,其中'user ='myuser'和host ='localhost''這會讓我回到我原來的狀態?然後我可以運行查詢來再次授予privs,但是這次使用''%''作爲主機。這聽起來不錯,或者我不應該與MySQL表搞亂? –

+0

'mysql.user'表爲 –

+0

通過運行DELETE命令刪除用戶不起作用。我必須通過Plesk並刪除並重新添加該用戶。我猜測,爲了給用戶正確的權限,必須運行後臺中的其他語句。 –

0

USAGE的意思是「沒有特權,這是從本地主機連接時,你給你的用戶。

我認爲本地主機優先%,所以當用戶從本地主機連接是將要使用授權。

授予訪問兩種模式爲%(或本地主機,如果這是你喜歡什麼),它應該是明確的和更好的工作。