PostgreSQLのバッチを,パスワードを聞かれずに実行する方法 (psqlも設定ファイル編集も不要)
PostgreSQLをバッチで自動実行する方法。パスワード入力なし。
PostgreSQLをコマンドラインから利用するためには,通常はpsqlを経由する。
psqlは実行時に必ずパスワードを聞かれるので,バッチによる自動運転は不可能。
技術的雑談-PostgreSQLの自動運転
http://www.himajin2001.com/wiki.cgi?page=%B5%BB%BD%D1%C5%AA%BB%A8%C3%CC-PostgreSQL%A4%CE%BC%AB%C6%B0%B1%BF%C5%BE
.pgpassでの設定内容と、psqlでのパラメータが完全に一致しないと対話形式でパスワードなどを聞いてきてしまいます。
psqlのオプションでパスワードを指定する方法は「ない」のでご注意ください。これは仕様です。
Postgresの使っている設定ファイル(pgpass.conf)を書き換えて,常にパスワード入力不要にしてしまうという方法もあるが,それはセキュリティ上問題があるだろう。開発現場で許可をもらうことは難しい。
かわりに,かんたんな方法がある。
「パスワードを聞かれずにSQLを実行するバッチ」を,WSHで作っておけばよいのだ。
まず,下記のようなファイルを psql_batch.js で保存。
/* パスワードを聞かれずにPostgreSQLを実行するバッチ 使い方: cscript /nologo psql_batch.js /DSN:ODBCデータソース名 /DB:DB名 /UID:ユーザ名 /PWD:パスワード /SQL:SQLファイルパス */ // 引数 var args = WScript.Arguments; var dsn = args.Named("DSN"); var schema = args.Named("DB"); var username = args.Named("UID"); var password = args.Named("PWD"); var filepath = args.Named("SQL"); // 接続文字列 var connection_string = "ODBC" + ";Driver={PostgreSQL Unicode}" + ";DSN=" + dsn + ";DATABASE=" + schema + ";UID=" + username + ";PWD=" + password + ";" ; // SQL var fso = WScript.CreateObject("Scripting.FileSystemObject"); var txt_r = fso.OpenTextFile( filepath, 1 ); var sql = ""; if( ! txt_r.AtEndOfStream ) { sql = txt_r.ReadAll(); } txt_r.Close(); // DB接続 var con = WScript.CreateObject("ADODB.Connection"); con.Open( connection_string ); // SQL実行 var rs = WScript.CreateObject("ADODB.Recordset"); rs.Open( sql, con, 0, 1 ); // 終了 con.close(); WScript.Echo("終了しました。");
実行したいSQLを準備して,コマンドプロンプトから
cscript /nologo psql_batch.js /DSN:ODBCデータソース名 /DB:DB名 /UID:ユーザ名 /PWD:パスワード /SQL:SQLファイルパス
のように打ち込めば,ODBC経由でSQLが実行される。
(このコマンドは,batファイルに格納しておけばよい。)
パスワードは聞かれない。
補足
ODBCの設定方法:
下記サイトから最新版のODBCドライバをダウンロード,インストール。
コントロールパネル>管理ツール>データソース(ODBC)で,ドライバに「PostgreSQL Unicode」が追加されている事を確認。
同じダイアログ上で,システムDSNのタブから新規データソースを追加して終了。
補足2
もしMySQLなら,SQLをバッチで実行する事も楽。
mysql -h ホスト名 -u ユーザ名 -pパスワード データベース名 < ファイル名
データベース名を省略して,SQLファイル中でCREATE DATABASEすることも可能。
Windows で MySQL を使おう MySQL 4.0 コマンド
http://www.mitchy-world.jp/itmemo/mysql/10.htm