2012-03-02 13 views
26

私はMySQLユーザー作成手順を自動化しようとしています。 私はその後、私はこのようにそれを呼び出す必要があります 、mysqlユーザの作成ステートメントを含んでいるでしょう一時ファイルを作成するものと考える:Mysqlユーザー作成スクリプト

のmysql -u rootが<一時

を-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桁の16進数があるべきです)。 @passwordタグの前後に一重引用符を削除しても、エラーが発生します(構文エラー)

どうすればこの問題を解決できますか?

+0

エラーメッセージは何ですか? –

+0

エラー1372(HY000)9行目:パスワードハッシュは41桁の16進数でなければなりません – ling

答えて

51

だけ答えになぜエラーが発生し、差異を表示するのですか?


A)@passwordハッシュストリング値:

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

PASSWORDキーワードの使用に注意してください! PASSWORDキーワードが欠落している注意

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


B)は@passwordクリアテキスト文字列値であることを期待します!例えばSnowman's answerを参照してください - "ハッシュ文字列は" SELECT PASSWORD('clearTextPasswd');の結果である

+1

説明を理解してください – matt

+1

ニース。素晴らしい説明。 – cbmeeks

+1

ありがとうございました – Abdel

1

試み:PASSWORDは、(引用符で)あなたのパスワードです

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

+0

はい、動作しますが、パスワードがmysql履歴ファイルにクリアフォームで表示される可能性が低いと聞きました。私はこの解決法を可能な限り避けることを好むでしょう。 – ling

+0

次に、私が示したように設定して、次のように変更することができます:SET PASSWORD FOR mytestdatabase = PASSWORD( 'PASSWORD'); – alfasin

+0

パスワードのクリアフォームが引き続き表示されますが、ファイルから呼び出されたため「mysql履歴」に記録されない可能性があります。私は、より多くの情報を "mysqlの歴史"が実際にどのように機能するのか試してみるかもしれません。ありがとうございました。 – ling

10

あなたはハッシュ化された形式で保存し、クリアテキストでパスワードを保存したくない場合 -

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

ハッシュされたパスワードは、このクエリの結果である -

SELECT PASSWORD('my password'); 
4

は、次のURLを見て、これは問題を解決するのに役立ちます:

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');

関連する問題