我使用具有更新权限的用户来执行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 NULL,
PRIMARY KEY (`id`)
)update_user的特权是:
grant update on *.* to 'update_user'@'%';MySQL版本为5.1.73。
谢谢。
发布于 2015-09-14 06:33:26
当你执行
UPDATE `stu` SET age = 27 WHERE name = 'zjw';SQL引擎必须首先选择需要更新的行。
因此,如果您没有SELECT特权,即使您拥有UPDATE特权,也无法执行这样的更新。
请查看格兰特语法手册。
发布于 2015-09-14 06:51:09
@罗宾,根据你最后的评论,试着理解你的更新声明-
UPDATE `stu` SET age = 27 WHERE name = 'zjw';上面的update语句首先尝试获取名称= 'zjw‘的记录,所以如果您的name列被索引了,那么选择use index,然后直接选择那些值为'zjw’的记录,否则它会扫描整个表并在表的任何位置选择‘zjw’。
这意味着在更新之前,mysql首先在内部使用select语句,因此您还需要具有任何其他特权的select特权,如update/delete等。
所以你的命令应该是-
GRANT SELECT, UPDATE on db.* to 'myuser'@'localhost' identified by 'mypass';您应该根据要求只授予特定的IP或本地主机权限,而不是按“%”全局授予权限,这是有风险的。
发布于 2018-05-17 06:59:58
因为当where子句在update中使用时,数据库将select满足where条件的行,因此在授予update特权时需要select特权。
读取列值的其他语句也需要SELECT特权。例如,对于col_name=expr赋值右侧的UPDATE语句中引用的列,或DELETE或UPDATE语句的WHERE子句中指定的列,都需要选择SELECT。
https://stackoverflow.com/questions/32558442
复制相似问题