首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误1143 (42000):选择拒绝命令

错误1143 (42000):选择拒绝命令
EN

Stack Overflow用户
提问于 2015-09-14 06:28:00
回答 3查看 9.8K关注 0票数 0

我使用具有更新权限的用户来执行sql:

代码语言:javascript
运行
复制
update stu set age = 27 where name='zjw';

我发现了一个错误:

错误1143 (42000):选择表“stu”中“name”列的“update_ user”@‘localhost’拒绝的命令

像这样的桌子:

代码语言:javascript
运行
复制
CREATE TABLE `stu` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

update_user的特权是:

代码语言:javascript
运行
复制
grant update on *.* to 'update_user'@'%';

MySQL版本为5.1.73。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-14 06:33:26

当你执行

代码语言:javascript
运行
复制
UPDATE `stu` SET age = 27 WHERE name = 'zjw';

SQL引擎必须首先选择需要更新的行。

因此,如果您没有SELECT特权,即使您拥有UPDATE特权,也无法执行这样的更新。

请查看格兰特语法手册。

票数 7
EN

Stack Overflow用户

发布于 2015-09-14 06:51:09

@罗宾,根据你最后的评论,试着理解你的更新声明-

代码语言:javascript
运行
复制
UPDATE `stu` SET age = 27 WHERE name = 'zjw';

上面的update语句首先尝试获取名称= 'zjw‘的记录,所以如果您的name列被索引了,那么选择use index,然后直接选择那些值为'zjw’的记录,否则它会扫描整个表并在表的任何位置选择‘zjw’。

这意味着在更新之前,mysql首先在内部使用select语句,因此您还需要具有任何其他特权的select特权,如update/delete等。

所以你的命令应该是-

代码语言:javascript
运行
复制
GRANT SELECT, UPDATE on db.* to 'myuser'@'localhost' identified by 'mypass';

您应该根据要求只授予特定的IP或本地主机权限,而不是按“%”全局授予权限,这是有风险的。

票数 2
EN

Stack Overflow用户

发布于 2018-05-17 06:59:58

因为当where子句在update中使用时,数据库将select满足where条件的行,因此在授予update特权时需要select特权。

读取列值的其他语句也需要SELECT特权。例如,对于col_name=expr赋值右侧的UPDATE语句中引用的列,或DELETE或UPDATE语句的WHERE子句中指定的列,都需要选择SELECT。

mysql手册

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32558442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档