Как предоставить привилегии всем столбцам, кроме одного? - PullRequest
2 голосов
/ 26 января 2012

Я хочу предоставить пользователю привилегию update для обновления всех столбцов, кроме одного - в моем случае - Id (изменение Id может привести к путанице в данных, существующих URL-адресах и т. Д. - внешние ключи не aрешение).Это возможно в MySQL без перечисления всех других столбцов?Например, как-то сказать:

grant update on db.table to user;
NOT grant update id on db.table to user;

или что-то подобное?

Причины, по которым я не хочу перечислять все столбцы:

  1. это более надежно - я часто добавляю некоторые столбцы в таблицы позже, и я, вероятно, забуду, что я должен также обновить это правило,

  2. У меня нет разрешения grant, поэтому яЯ должен попросить моего хостинг-провайдера выполнить каждую команду grant, поэтому я хочу минимизировать эти запросы, поскольку это стандартная услуга (это их милость).

Специально дляmysql, но меня также интересует решение gereric sql.

Ответы [ 5 ]

2 голосов
/ 26 января 2012

Вы должны узнать больше о целостности базы данных, примерно о внешних ключах .

Внешние ключи - это способ, которым система Dabase Relational сохраняет целостность без каких-либо артефактов.Из документации mySql FK :

"ОГРАНИЧЕНИЕ: отклоняет операцию удаления или обновления для родительской таблицы."

Избегать повреждения при использовании внешнего ключанекоторые преимущества :

  • Встроенная функциональность: производительность будет лучше, чем у триггера или других систем.
  • Стандартный способ сделать это: другоеразработчики могут понять, что вы делаете.
  • Решение для создания отчетов и другие приложения могут узнать о словаре базы данных по судам отношений.

РЕДАКТИРОВАНИЕ из-за комментариев OP

Невозможно предоставить привилегию высокого уровня объекту, а затем отозвать привилегию низкого уровня, взглянуть на выборочные привилегии в MySQL (и проголосовать за ответ).

Это означает, что вы должны предоставить привилегии вставки для таблицы, выбрать привилегии для всех полей и обновлять только для полей без идентификатора.Вы можете написать сценарий, который сделает это за вас.

Я надеюсь, что это, наконец, ответит на ваш вопрос.

1 голос
/ 26 января 2012

Создание хранимых процедур, которые выполняют (Выбрать, Вставить, Обновить, Удалить) операции с данными.

Предоставьте пользователю доступ только к процедурам, а не к таблицам.

1 голос
/ 26 января 2012

Я думаю, это может сработать: -

revoke update (id) on db.table from user;
1 голос
/ 26 января 2012

AFAIK невозможно, если вы боитесь согласованности базы данных, вы должны использовать ограничение внешнего ключа , чтобы сохранить согласованность базы данных.

0 голосов
/ 15 июня 2013

Это невозможно - более подробно см. этот вопрос .

...