Mysql 错误1143(42000):选择命令被拒绝
我使用具有更新权限的用户执行sql:Mysql 错误1143(42000):选择命令被拒绝,mysql,Mysql,我使用具有更新权限的用户执行sql: update stu set age = 27 where name='zjw'; 我得到了这个错误: 错误1143(42000):选择拒绝给用户的命令 表“stu”中“name”列的“update_user”@“localhost” 如下表所示: CREATE TABLE `stu` ( `id` int(11) NOT NULL, `name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT
update stu set age = 27 where name='zjw';
我得到了这个错误:
错误1143(42000):选择拒绝给用户的命令
表“stu”中“name”列的“update_user”@“localhost”
如下表所示:
CREATE TABLE `stu` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
更新用户的权限为:
grant update on *.* to 'update_user'@'%';
MySQL版本是5.1.73
谢谢。当您执行
UPDATE `stu` SET age = 27 WHERE name = 'zjw';
SQL引擎必须首先选择需要更新的行
因此,如果您没有SELECT
权限,即使您有update
权限,也无法执行此类更新
查看手册中的。@Robin根据您最后的评论,尝试理解您的更新声明-
UPDATE `stu` SET age = 27 WHERE name = 'zjw';
上面的update语句首先尝试获取name='zjw'所在的记录,因此,如果您的name列被索引,则选择use index并直接选择仅具有值'zjw'的记录,否则它将扫描整个表,并在表中的任何位置选择'zjw'
这意味着在更新之前,mysql首先在内部使用select语句,所以您还需要select权限和任何其他权限,如更新/删除等
所以你的授权命令应该是-
GRANT SELECT, UPDATE on db.* to 'myuser'@'localhost' identified by 'mypass';
您应该根据需要只授予特定IP或本地主机权限,而不是“%”全局权限,这是有风险的。因为当在
更新中使用where
子句时,数据库将选择满足where
条件的行,因此,在授予update
权限时,需要select
权限
其他读取列值的语句也需要SELECT权限。例如,UPDATE语句中col_name=expr赋值右侧引用的列或DELETE或UPDATE语句的WHERE子句中命名的列需要SELECT
错误与选择权限有关,但您给出了更新。。。您为什么不尝试授予实际导致错误的特权?错误error 1143(42000):SELECT command DENITED to user
似乎非常具体。用户是否只有更新权限?或者它也有选择权。在查看错误时,授予SELECT权限似乎可以解决您的问题。在我向用户授予SELECT权限后,错误消失。但我也不明白为什么用户有更新权限,但它不能更新数据?谢谢,这就是我所困惑的。你的答案很好,谢谢。我在没有where子句的情况下尝试了以下sql:update stu set age=27,这是正确的。又来了。