首页 > 解决方案 > 缺少“在重复密钥更新上插入 [...]”语句的权限,但足以分别“插入”和“更新”

问题描述

我试图将数据库用户拥有的权限减少到所需的最低限度。这样做我注意到以下情况:

我有一个数据库test和一个user具有以下权限的用户:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'%';
GRANT SELECT, INSERT ON test.test TO 'user'@'%';
GRANT UPDATE (y) ON test.test TO 'user'@'%';

test(InnoDB)定义为

create table test
(
    x int null,
    y int null
);

create unique index test_x_uindex on test (x);

我可以运行insertupdate查询

INSERT INTO test (x,y) VALUES (1,1), (2,2);
UPDATE test SET y = 3 WHERE x = 1;

但是跑步

INSERT INTO test (x,y) VALUES (2,4) ON DUPLICATE KEY UPDATE y = VALUES(y);

结果是

错误 1143 (42000): UPDATE 命令拒绝用户 'sap'@'localhost' 用于表 'test' 中的列 'x'

如果该语句实际上不会更新某些内容而只是插入一个新行,则会发生同样的情况。

这似乎有点奇怪。我找不到直接相关的错误报告。只是MySQL 的旧东西(已关闭,但有人说它实际上并没有修复。我没有测试它。)。在MySQL 8.0 的文档中,提到仅更改的列需要更新权限。MariaDB 文档没有提到任何权限要求。

我错过了什么吗?

这一切都在 MariaDB 10.2.16 上进行了测试。

标签: mariadbprivilegeson-duplicate-key

解决方案


推荐阅读