スポンサーリンク

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ドライバをダウンロード,インストール。

http://www.postgresql.org/ftp/odbc/versions/msi/


コントロールパネル>管理ツール>データソース(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