mariadb - 缺少“在重复密钥更新上插入 [...]”语句的权限,但足以分别“插入”和“更新”
问题描述
我试图将数据库用户拥有的权限减少到所需的最低限度。这样做我注意到以下情况:
我有一个数据库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);
我可以运行insert
和update
查询
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 上进行了测试。
解决方案
推荐阅读
- c# - 有条件的“使用”
- python - Python - 在标签中加载图像
- php - Laravel 修补文本建议或通过 Tab 键自动完成
- reactjs - 如何处理组件渲染后出现axios响应的情况?
- javascript - 如何使服务器/srr 仅呈现为 vue 组件?
- java - 将记录删除到表中并获取删除的行数
- java - 无法通过在方法 FindById() 中使用主键来获取单个对象
- c - 使用 strcpy 和相等字符串的地址有什么区别?
- jquery - ASP NET MVC CORE - 每 X 秒刷新一次局部视图
- python - 按下 CTRL+C 时如何防止 ^C 显示