【问题标题】:ERROR 1143 (42000): SELECT command denied错误 1143 (42000):SELECT 命令被拒绝
【发布时间】:2015-12-10 01:54:22
【问题描述】:

我使用一个有更新权限的用户执行一条sql:

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

我收到了这个错误:

错误 1143 (42000):SELECT 命令拒绝用户 'update_user'@'localhost' 用于表 'stu' 中的列 'name'

这样的表格:

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。

谢谢。

【问题讨论】:

  • 这个错误是关于 SELECT 权限的,但是你给了 UPDATE ...你为什么不尝试给这个权限呢?实际上导致了错误?
  • 错误ERROR 1143 (42000): SELECT command denied to user 似乎非常具体。用户是否只有 UPDATE 权限?或者它是否也有 SELECT 权限。查看错误时,授予 SELECT 权限似乎可以解决您的问题。
  • 在我给用户选择权限后,错误消失了。但我也很困惑为什么用户有更新权限,但它不能更新数据?

标签: mysql


【解决方案1】:

当你执行时

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

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

因此,如果您没有SELECT 权限,即使您拥有UPDATE 权限,也无法执行此类更新。

查看Grant Syntax 的手册。

【讨论】:

  • 谢谢,这就是我的困惑。
【解决方案2】:

@Robin 根据您的最后评论,请尝试理解您的更新声明-

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

您上面的更新语句首先尝试获取 name='zjw' 的记录,因此如果您的 name 列被索引,则选择使用索引并直接选择仅具有值 'zjw' 的记录,否则它将扫描整个表并选择'zjw' 在表中的任何位置。

意味着首先 mysql 在更新之前在内部使用 select 语句,因此您还需要选择权限以及任何其他权限,如更新/删除等。

所以你的授权命令应该是-

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

您应该根据要求仅授予特定 IP 或 localhost 的权限,而不是通过 '%' 全局授予权限,这是有风险的。

【讨论】:

  • 你的回答太好了,谢谢。我试过这个 sql:update stu set age=27 没有 where 子句,它是正确的。再次感谢。
【解决方案3】:

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

读取列值的其他语句也需要 SELECT 权限。例如,UPDATE 语句中 col_name=expr 赋值右侧引用的列或 DELETE 或 UPDATE 语句的 WHERE 子句中命名的列需要 SELECT。

mysql manual here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 2018-01-12
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多