2015-09-14 85 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