我试图将数据库用户拥有的权限减少到所需的最低限度。这样做时,我注意到了以下情况:
我有一个数据库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):表'test'中列'x'的用户'sap'@'localhost'的UPDATE命令被拒绝
如果该语句实际上不会更新某些内容,而只是插入新行,则会发生同样的情况。
这似乎有点奇怪。我找不到直接相关的错误报告。只是older for MySQL(已关闭,但有人说它实际上没有修复。我没有测试过。)。在documentation of MySQL 8.0中,提到只有更改的列才需要更新特权。 MariaDB documentation没有提到任何特权要求。
我想念什么吗?
所有内容均已在MariaDB 10.2.16上进行了测试。