Как вычесть привилегии в MySQL

Я хочу отозвать привилегии обновления из 2 столбцов таблицы «транзакция». Я хочу, чтобы у пользователя был полный доступ ко всем другим таблицам и данным.

mysql> REVOKE UPDATE (system, consumer) ON ledger.transact FROM 'foo'@'localhost';
ERROR 1147 (42000): There is no such grant defined for user 'foo' on host 'localhost' on table 'transaction'

Вышеупомянутое не работает.


person shantanuo    schedule 15.11.2011    source источник
comment
Я не думаю, что есть отрицательные разрешения, так что это не сработает. Вы должны явно предоставить ему права доступа ко всем другим таблицам и исключить те, которые вы хотите ограничить.   -  person Thilo    schedule 15.11.2011


Ответы (4)


Я согласен с Тило — вы сможете отозвать эти привилегии столбца только в том случае, если вы предоставили их ранее. Вы не можете предоставить на более высоком уровне (например, таблице), а затем отозвать на более детальном уровне. Я думаю, что это описано в справочном руководстве mysql MySql 5.1, глава 12.7.1.3:

«Привилегии для базы данных, таблицы, столбца или подпрограммы формируются аддитивно как логическое ИЛИ привилегий на каждом из уровней привилегий. Например, если у пользователя есть глобальная привилегия SELECT, привилегия не может быть отклонена отсутствием привилегии на уровне базы данных, таблицы или столбца».

Как получить выборочные привилегии уже описано Девартом.

person miherrma    schedule 15.11.2011

Начиная с MySQL 8.0.16, вы, наконец, можете вычесть привилегии , хотя пока только из глобальных грантов (например, для отдельных столбцов пока нельзя), но стоит отметить:

Начиная с MySQL 8.0.16, можно явно отказать в привилегии, предоставленной на глобальном уровне, путем отзыва ее для определенных баз данных, если включена системная переменная partial_revokes:

GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;

Системная переменная partial_revokes должна установить для этого:

Включение этой переменной позволяет частично отозвать привилегии. В частности, для пользователей, имеющих привилегии на глобальном уровне, partial_revokes позволяет отзывать привилегии для определенных схем, оставляя привилегии для других схем. Например, пользователю, имеющему глобальную привилегию UPDATE, можно запретить использовать эту привилегию в системной схеме mysql. (Или, другими словами, пользователь может использовать привилегию UPDATE для всех схем, кроме схемы mysql.) В этом смысле пользовательская глобальная привилегия UPDATE частично аннулируется.

person Solarflare    schedule 19.08.2020

Во-первых, удалите все привилегии (на уровне базы данных, таблицы, столбца).

  1. Предоставьте привилегии UPDATE (... и другие) для КАЖДОЙ таблицы, кроме «транзакций».
  2. Предоставьте привилегию UPDATE указанным полям в таблице «транзакция».
person Devart    schedule 15.11.2011

Я предполагаю, что «ledger.transact» - это ваша таблица? Это должно работать так, чем:

REVOKE UPDATE ON ledger.transact FROM 'foo'@'localhost';

посмотрите также здесь для синтаксиса отзыва, используемого в mysql.

person Termi    schedule 15.11.2011