2012-03-02 204 views
26

我试图自动化MySQL用户创建过程。 我想创建将包含MySQL用户创建报表的临时文件,然后 我会这样称呼它:Mysql用户创建脚本

的mysql -u根-proot <临时

但我坚持了MySQL的句法: 这里是我的临时文件的内容:


DROP DATABASE IF EXISTS mytestdatabase; 
CREATE DATABASE mytestdatabase; 
SELECT @password:="my password"; 
DELETE FROM mysql.user WHERE Host='localhost' AND User='mytestdatabase'; 
GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' IDENTIFIED BY PASSWORD '@password'; 
FLUSH PRIVILEGES; 

而行

GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' IDENTIFIED BY PASSWORD '@password'; 

(密码哈希应该是一个41位十六进制数)

不被解释为我希望它是。 即使我删除@password标签周围的单引号,我仍然有错误(语法错误)

我该如何做这项工作?

+0

什么是错误信息? – 2012-03-02 07:44:37

+0

错误1372(HY000)在第9行:密码散列应该是一个41位十六进制数字 – ling 2012-03-02 07:48:56

回答

51

只是为了回答为什么发生错误并显示差异:


A)预计@password散列字符串值:

GRANT ALL PRIVILEGES 
    ON `mydb` . * TO 'username'@'localhost' IDENTIFIED 
BY 
PASSWORD '@password'; 

注意使用PASSWORD关键字!


B)预计公司@password是一个明文字符串值:

GRANT ALL PRIVILEGES 
    ON `mydb` . * TO 'username'@'localhost' IDENTIFIED 
BY 
'@password'; 

失踪PASSWORD关键字!


其中 “散列串” 是SELECT PASSWORD('clearTextPasswd');结果 - 见Snowman's answer的一个例子。

+1

欣赏解释 – matt 2012-06-29 20:53:48

+1

不错。很好的解释。 – cbmeeks 2012-07-03 14:12:28

+1

非常感谢你 – Abdel 2014-10-03 13:01:31

1

尝试:

GRANT ALL PRIVILEGES ON mytestdatabase.* 
     TO [email protected] IDENTIFIED BY 'PASSWORD'; 

其中password是你的密码(引号)。

+0

是的,它会工作,但我听说它不太安全,因为密码可以清晰的形式出现在mysql历史文件中。我希望尽可能避免使用此解决方案。 – ling 2012-03-02 07:50:59

+0

然后你可以按照我的设置来设置它,然后像这样改变它:SET PASSWORD FOR mytestdatabase = PASSWORD('PASSWORD'); – alfasin 2012-03-02 07:52:45

+0

密码的清晰形式仍然出现,但也许是因为它是从文件调用的,它不会记录在“mysql历史记录”中。我可能试图获得更多的信息,如何“MySQL历史”真正起作用。谢谢。 – ling 2012-03-02 08:05:59

10

如果你不想来存储明文密码,然后将其保存散列格式 -

GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' 
    IDENTIFIED BY PASSWORD '*7560636C2922C05954FE6A2446AA00C84708B57B'; 

哪里哈希密码是这个查询的结果 -

SELECT PASSWORD('my password'); 
4

看看下面的网址,这将帮助你解决这个问题:

http://linuxadministrator.pro/blog/?p=147

mysql> select password('12345'); 
+-------------------------+ 
| password('123456') | 
+-------------------------+ 
| 2ff898e158cd0311  | 
+-------------------------+ 
1 row in set (0.00 sec) 

mysql> create user test identified by password '2ff898e158cd0311'; 
Query OK, 0 rows affected (0.00 sec) 
0

我打开phpMyAdmin的,走到用户选项卡,发现我是用户试图连接点击编辑权限,滚动到更改登录信息/复制用户部分,并选择任何主机为主机选项,它被设置为本地。当我点击Go按钮时,它会生成一个类似于这里列出的脚本。

GRANT ALL PRIVILEGES ON * . * TO 'james'@'%' IDENTIFIED BY PASSWORD '*780E1D13F1C7713F341A117499C6D8644464C4CF' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; 
0

好帽子是错误bcoz你已经写了错误的方式就是你已经写了,

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' IDENTIFIED BY PASSWORD '@password'; 

;而真正的语法如下。看这里。

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' IDENTIFIED BY '@password'; 

因为您的密码导致了该错误。它必须如图所示。

4

我也有同样的问题,它只是通过提到的查询设置密码解决下面。

SET PASSWORD FOR 'user'@'localhost' = PASSWORD('MyNewPass');