Отсутствует привилегия для оператора «вставить [...] при обновлении дублированного ключа», но достаточно для «вставки» и «обновления» по отдельности - PullRequest
0 голосов
/ 27 ноября 2018

Я попытался уменьшить права пользователя базы данных до необходимого минимума.При этом я заметил следующую ситуацию:

У меня есть база данных 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' для столбца 'x' в таблице 'test'

То же самое происходит, если оператор не будетна самом деле обновить что-то, но просто вставить новую строку.

Это кажется немного странным.Я не смог найти отчет об ошибке, связанный напрямую.Просто что-то старше для MySQL (закрыто, но кто-то сказал, что это на самом деле не исправлено. Я не проверял это.).В документации MySQL 8.0 упоминается, что права на обновление необходимы только для измененных столбцов.В документации MariaDB не указаны какие-либо требования к привилегиям.

Я что-то пропустил?

Все это было проверено на MariaDB 10.2.16.

...