Como dar aos usuários do MySQL direitos CREATE DB?

1

Eu quero dar aos usuários do MySQL a capacidade de criar novos bancos de dados e ter TODOS os privilégios neles, mas não no outro banco de dados. Eu tentei criar um PROCEDIMENTO ARMAZENADO para isso, mas não está funcionando. Este é o meu procedimento ( NOTA: CÓDIGO ATUALIZADO ABAIXO):

DELIMITER //
CREATE DEFINER = 'root'@'localhost' PROCEDURE createdb(IN newdb VARCHAR(255))
BEGIN
  CREATE DATABASE newdb;
  SET @newdbuser = USER();
  GRANT ALL ON newdb.* TO '@newdbuser';
  FLUSH PRIVILEGES;
END //
DELIMITER ;

Eu chamo o procedimento usando:

CALL createdb('newtestdb');

Mas o que acontece é que o banco de dados 'newdb' (nome da variável) é criado. Tentar acessar esse banco de dados como o usuário mortal que chamou o procedimento também não funciona: acesso negado.

Pergunta: O que há de errado com meu PROCEDIMENTO? Ou eu estou atacando o problema do ângulo errado?

UPDATE Com base na resposta do longneck, eu revisei o procedimento para:

DELIMITER //

CREATE DEFINER = 'root'@'localhost' PROCEDURE createdb(IN newdb VARCHAR(255))
BEGIN

PREPARE stmt1 FROM "CREATE DATABASE ?";
PREPARE stmt2 FROM "GRANT ALL ON newdb.* TO '?'";

EXECUTE stmt1 USING @newdb;

SET @newdbuser = USER();
EXECUTE stmt2 USING @newdbuser;

FLUSH PRIVILEGES;

END //

DELIMITER ;

No entanto, ao chamar esse procedimento usando "CALL createdb ('testing');" Eu recebo:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

O que estou perdendo?

    
por vincent.io 17.08.2012 / 14:53

2 respostas

1

isso não é um problema de direitos. O mysql não suporta variáveis como nomes de objetos (onde os objetos são tabelas, bancos de dados, colunas, etc.). você terá que usar instruções preparadas e construir seu comando como uma string. veja link

por exemplo, suas instruções PREPARE precisam se parecer com:

PREPARE stmt1 FROM concat("CREATE DATABASE ", @dbname);
PREPARE stmt2 FROM concat("GRANT ALL ON newdb.* TO ", @username);

não que isso NÃO seja seguro para injeção. Certifique-se de ter limpado seus "parâmetros" (nome do banco de dados, nome de usuário) antes de usar estas instruções.

também, você está concedendo seu privilégio errado. TO '@newdbuser' atribui o privilégio aos usuários que se conectam de um computador chamado newdbuser . você precisa colocar o sinal @ após o nome de usuário.

    
por 17.08.2012 / 15:10
2

Não existe privilégio como CREATE DATABASE. Apenas o privilégio CREATE concede a criação de banco de dados, tabelas e índices

por 17.08.2012 / 22:17

Tags