2015-09-14 83 views
0

我用誰擁有更新權限的用戶執行一個SQL:ERROR 1143(42000):SELECT命令否認

update stu set age = 27 where name='zjw'; 

我得到這個錯誤:

ERROR 1143 (42000): SELECT command denied to user 'update_user'@'localhost' for column 'name' in table 'stu'

像這樣的表:

CREATE TABLE `stu` (
    `id` int(11) NOT NULL, 
    `name` varchar(20) DEFAULT NULL, 
    `age` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

update_user的權限是:

grant update on *.* to 'update_user'@'%'; 

MySQL版本是5.1.73。

謝謝。

+1

錯誤是關於** SELECT **特權,但你給**更新** ...爲什麼你不試着給出實際上導致錯誤的特權? –

+2

錯誤'錯誤1143(42000):拒絕給用戶的SELECT命令似乎很特殊。用戶是否只有更新權限?還是它也有SELECT權利。在查看錯誤時,授予SELECT權利似乎可以解決您的問題。 – Willem

+0

當我給用戶選擇特權後,錯誤消失。 但我也混淆了爲什麼用戶具有更新權限,但它無法更新數據? – Robin

回答

6

當你執行

UPDATE `stu` SET age = 27 WHERE name = 'zjw'; 

SQL引擎必須先選擇需要更新的行。

因此,如果您沒有SELECT權限,即使您擁有UPDATE權限,也無法執行此類更新。

查看Grant Syntax的手冊。

+0

謝謝,這就是我困惑。 – Robin

+0

不錯的工作Matteo – Drew

2

@Robin按你最後的評論,試圖瞭解您的更新陳述書

UPDATE `stu` SET age = 27 WHERE name = 'zjw'; 

你上面更新語句首先嚐試獲取其中name =「ZJW」,所以如果你的名字列索引的記錄然後選擇使用索引並直接選擇只記錄那些值爲'zjw'的數據,否則它將掃描整個表格,並在表格中選擇'zjw'。

首先意味着MySQL的使用select語句內部更新之前,所以你還需要與其他任何的特權,如更新的選擇權限/刪除等

所以你的授權命令應該是─

GRANT SELECT, UPDATE on db.* to 'myuser'@'localhost' identified by 'mypass'; 

你應該根據需要只允許特定的IP或本地主機,而不是全球範圍內有風險的'%'。

+0

您的回答非常好,謝謝。 我試過這個sql:update stu set age = 27 沒有where子句,它是正確的。 再次。 – Robin

+0

肯定的重要一點。 – Drew