Предоставление привилегий на несколько таблиц с определенным префиксом

Я использую метод префикса таблицы, чтобы несколько клиентов использовали одну и ту же базу данных. Количество таблиц, созданных для каждого клиента, будет ~55. Вместо того, чтобы делать все предоставление, вручную перечисляя таблицы, могу ли я сделать что-то вроде следующего?

GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';

person Chad    schedule 04.05.2011    source источник
comment
Это странно. Вот тот же вопрос с положительными ответами.   -  person Pavel Strakhov    schedule 24.05.2012
comment
@PavelStrakhov Я знаю, что ваш комментарий устарел, но этот вопрос касается подстановочного знака таблицы (который не поддерживается MySQL), а ваш связанный вопрос касается подстановочного знака базы данных (который поддерживается)   -  person leemes    schedule 25.07.2014


Ответы (4)


Предварительное примечание: это не мой ответ. Я нашел его по адресу http://lists.mysql.com/mysql/202610, скопировал и вставлено для простоты кредит Стивену Куку

Вы можете использовать представление INFORMATION_SCHEMA.TABLES для создания операторов GRANT. Напишите запрос в следующих строках:

SELECT   CONCAT('GRANT SELECT ON test.', TABLE_NAME, ' to ''foouser'';')
FROM     INFORMATION_SCHEMA.TABLES
WHERE    TABLE_SCHEMA = 'test'
      AND TABLE_NAME LIKE 'foo_%'

Затем запустите его, скопируйте результаты и запустите эти результаты как запрос или сценарий. Конечно, вы можете сходить с ума, как хотите, например, если вы делаете это для многих пользователей, возможно, напишите хранимую процедуру, которая принимает параметр для имени пользователя и, следовательно, может использоваться в качестве инструмента всякий раз, когда вам это нужно.

Это не синтаксис, который вы просили, но это хороший трюк, который работает.

--

Замените схему таблицы «test» на имя вашей базы данных. foo_% можно заменить соответствующим префиксом_%

Я попробовал это самостоятельно, и это сработало отлично.

person CogitoErgoSum    schedule 04.05.2011
comment
ОП не любезно принял этот ответ, но мне это помогло +1 - person user470714; 10.06.2011
comment
Вы спасли день для меня, сэр! - person jestro; 09.01.2012
comment
отличное решение, если вам нужно добавить определенные привилегии для множества (префиксных) таблиц. - person Ramon de la Fuente; 03.10.2012
comment
То же самое работает и для PostgreSQL, если вы просто потеряете одинарные кавычки, связанные вокруг имени пользователя. +1 - person Gjordis; 23.06.2015
comment
Хорошее решение. Но это не распространяется на случай, когда новая таблица с этим префиксом создается после того, как пользователю были предоставлены привилегии. - person Sergii Golubev; 12.02.2021

Я не уверен, можете ли вы использовать подстановочные имена таблиц, но вы определенно можете использовать подстановочные имена для баз данных. Однако будьте осторожны, так как _ — это подстановочный знак, соответствующий любому отдельному символу (например, . в регулярном выражении).

Документация находится здесь: http://dev.mysql.com/doc/refman/5.5/en/grant.html

Подстановочные знаки «_» и «%» разрешены при указании имен баз данных в операторах GRANT, которые предоставляют привилегии на глобальном уровне или на уровне базы данных. Это означает, например, что если вы хотите использовать символ «_» как часть имени базы данных, вы должны указать его как «\_» в операторе GRANT, чтобы пользователь не мог получить доступ к дополнительным базам данных, соответствующим подстановочный шаблон; например, GRANT ... ON `foo\_bar`.* TO ....

person James C    schedule 04.05.2011
comment
Похоже, мы НЕ МОЖЕМ использовать подстановочные знаки для имен таблиц. - person Nam G VU; 17.01.2017

Следующее

GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'

отлично работает (проверено с MySQL 5.6.12 в Windows)

person Grynn    schedule 04.12.2013
comment
К сожалению, это работает только для динамического указания имени базы данных вместо динамического указания имен таблиц. - person Danny Bullis; 12.02.2019
comment
В 5.7 это не работает. Как описано в документации по адресу Синтаксис GRANT. : Если имя базы данных используется не для предоставления привилегий на уровне базы данных, а в качестве квалификатора для предоставления привилегий какому-либо другому объекту, такому как таблица или подпрограмма, подстановочные знаки рассматриваются как обычные символы. - person Courtney Miles; 18.02.2019

используя баш:

mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
person tilo    schedule 08.04.2013