У нас есть несколько баз данных с одинаковой структурой, работающих на нашем сервере MySQL. Теперь нам нужен пользователь, которому требуются привилегии INSERT для всех баз данных, но для конкретной таблицы.
Является ли это возможным?
Я попробовал грант ниже, но не повезло:
предоставить INSERT в * .mytable для 'myuser' @ '%'
Как видите, я стараюсь избегать создания одного пользователя для каждой базы данных. Если описанный выше подход невозможен, есть ли другой способ достичь этой цели?
Я знаю, что возможно обратное (создайте пользователя, который имеет привилегии для всех таблиц данной базы данных или всех таблиц во всех базах данных). Я могу добиться этого, выполнив:
предоставить на dbname. * 'myuser' @ '%'
предоставить *. * 'myuser' @ '%'
Здесь описаны глобальные привилегии: http://dev.mysql.com/doc/refman/5.1/en/grant.html#grant-global-privileges, но я не нашел там такой опции.
Возможно, вам придется взломать его, используя таблицы схемы mysql, чтобы предоставить вам необходимые гранты:
Прежде всего, вот описание mysql.tables_priv
mysql> show create table mysql.tables_priv\G
*************************** 1. row ***************************
Table: tables_priv
Create Table: CREATE TABLE `tables_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '',
`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges'
1 row in set (0.00 sec)
mysql>
Возможно, вам придется собрать все базы данных, в которых есть mytable, и добавить строку '.mytable'
SELECT CONCAT(table_schema,'.',table_name) my_table
FROM information_schema.tables WHERE table_name = 'mytable';
Затем возьмите этот список и создайте соответствующий грант для этого списка таблиц для каждого конкретного пользователя.
SELECT CONCAT('GRANT ALL PRIVILEGES ON ',my_table,' TO ',userhost,';') SQLGrantCommand
FROM
(
SELECT CONCAT('''',user,'''.''',host,'''') userhost
FROM mysql.user WHERE user NOT IN ('','root')
) user_list,
(
SELECT CONCAT(table_schema,'.',table_name) my_table
FROM information_schema.tables WHERE table_name = 'mytable';
) table_list;
Вы должны взять этот запрос и экспортировать его в текстовый файл с именем /root/GlobalTableGrants.sql.
mysql -uroot -A --skip-column-names -e"SELECT CONCAT('GRANT ALL PRIVILEGES ON ',my_table,' TO ',userhost,';') SQLGrantCommand FROM (SELECT CONCAT('''',user,'''.''',host,'''') userhost FROM mysql.user WHERE user NOT IN ('','root')) user_list,(SELECT CONCAT(table_schema,'.',table_name) my_table FROM information_schema.tables WHERE table_name = 'mytable') table_list" > /root/GlobalTableGrants.sql
Теперь просто войдите в mysql, запустите этот скрипт
mysql> source /root/GlobalTableGrants.sql
После запуска скрипта сделайте это
SELECT * FROM mysql.tables_priv WHERE table_name = 'mytable'\G
Вы должны увидеть каждое вхождение my_table с включенными привилегиями уровня таблицы.
Попробуйте !!!