Назад | Перейти на главную страницу

Можно ли указать глобальные привилегии MySQL для конкретной таблицы во всех базах данных?

У нас есть несколько баз данных с одинаковой структурой, работающих на нашем сервере 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 с включенными привилегиями уровня таблицы.

Попробуйте !!!