Предоставить привилегии для нескольких таблиц с определенным префиксом
Я использую метод префикса таблицы для того, чтобы несколько клиентов использовали одну и ту же базу данных. Количество таблиц, созданных для каждого клиента, будет ~ 55. Вместо того, чтобы делать все предоставленные вручную путем перечисления таблиц, могу ли я сделать что-то вроде следующего?
GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
Ответы
Ответ 1
Предварительная заметка: Это не мой ответ. Я нашел его в 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_%'
Затем запустите его, скопируйте результаты и запустите эти результаты в виде запроса или
script. Разумеется, вы можете сходить с ума, как хотите, для
Например, если вы сделаете это для многих пользователей, возможно, напишите хранимую процедуру
который принимает параметр для имени пользователя и поэтому может быть использован как
инструмент, когда вам это нужно.
Это не синтаксис, который вы просили, но это хороший трюк, который работает.
-
Замените таблицу "test" таблицы именем вашей базы данных. foo_% может быть заменен соответствующим приставкой _%
Я пробовал это самостоятельно, и он отлично работал.
Ответ 2
Я не уверен, если вы можете использовать подстановочные имена таблиц, вы можете определенно использовать подстановочные имена баз данных. Остерегайтесь, так как _
- это подстановочный знак, соответствующий любому одиночному символу (например, .
в регулярном выражении).
Документация находится здесь: http://dev.mysql.com/doc/refman/5.5/en/grant.html
Подстановочные знаки "_" и "%" разрешено при указании базы данных имена в заявлениях GRANT, которые предоставляют привилегии в глобальной или базе данных уровни. Это означает, например, что если вы хотите использовать символ "_" в качестве часть имени базы данных, вы должны укажите его как "\ _" в GRANT, чтобы предотвратить возможность доступа к дополнительным базы данных, соответствующие шаблону шаблон; например, GRANT... ON `foo\_bar`. * TO....
Ответ 3
Следующие
GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'
отлично работает (протестирован с MySQL 5.6.12 в Windows)
Ответ 4
с помощью bash:
mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"