É possível especificar privilégios globais do MySQL para uma tabela específica em todos os bancos de dados?

2

Temos vários bancos de dados com a mesma estrutura em execução no nosso servidor MySQL. Agora precisamos de um usuário que requer privilégios INSERT em todos os bancos de dados, mas em uma tabela específica.

É possível?

Eu tentei a concessão abaixo, mas sem sorte:

grant INSERT on *.mytable to 'myuser'@'%'

Como você pode ver, estou tentando evitar a criação de um usuário por banco de dados. Se a abordagem acima não for possível, existe alguma outra maneira de atingir esse objetivo?

Eu sei que o oposto é possível (crie um usuário que tenha privilégios em todas as tabelas de um banco de dados ou em todas as tabelas em todos os bancos de dados). Eu posso consegui-lo fazendo:

grant on dbname.* to 'myuser'@'%'

grant on *.* to 'myuser'@'%'

Os privilégios globais são descritos aqui: link , mas não encontrei essa opção lá.

    
por Luis Fernando Alen 13.03.2012 / 17:03

1 resposta

2

Você pode ter que hackear usando tabelas de esquema mysql para fazer as doações que você precisa:

Primeiro de tudo, aqui está a descrição do 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>

Você pode ter que reunir todos os bancos de dados que possuem mytable e anexar a string '.mytable'

SELECT CONCAT(table_schema,'.',table_name) my_table
FROM information_schema.tables WHERE table_name = 'mytable';

Em seguida, pegue essa lista e crie a concessão adequada para essa lista de tabelas para cada usuário específico

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;

Você deve pegar essa consulta e exportá-la para um arquivo de texto chamado /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

Agora é só entrar no mysql para executar esse script

mysql> source /root/GlobalTableGrants.sql

Depois de executar o script, faça isso

SELECT * FROM mysql.tables_priv WHERE table_name = 'mytable'\G

Você deve ver todas as ocorrências de my_table com os privs de nível de tabela ativados.

Experimente!

    
por 13.03.2012 / 17:54