営業から出張中、販売管理プログラムを使用して単価参照したいという希望がありました。データのセキュリティーということを考えれば非常に危ないのですが、まあ、そこはパスワードをチャント設定してもらうことにして、ノートパソコンにデータをまるごとコピーすることにしました。

元々、Solaris+PostgreSQL8.1+Access2007で運用しています。ノートPCにWindows版のPostgreSQLをインストールして販売管理プログラムを動かします。

希望者は2名。一人はAppleのノートPCもう一人はハードディスク8GのネットPCです。
Apple MacについてはMac版のVMware+WindowsXPで使用します。
ネットPCのハードディスク容量は8Gと、かなり小さいのですが、私の個人持ちのASUS EeePC900(CドライブはSSD 8GB)でクライアントとしての動作確認したことがあるので、PostgreSQLをインストールしてもなんとかなりそうです。

SolarisのPostgreSQLのダンプデータはWindows版PostgreSQLにそのままリストアできます。バージョンは8.1です。

まあ、PostgreSQLもAccess2007も動作そのものは問題ないのですが、問題はどうやって簡単にPostgresSQLのダンプデータをノートPCにリストアしていくかです。

だいたいWindowsのコマンドプロンプトを使ったことが無い人間に、「PostgreSQLのメニューにあるコマンドプロンプトからdropdb、createdb、pg_restoreするんだ!」と言ってみたところで、そんな面倒なことできるわけがありません。実際、半年前、Macにインストールした販売管理プログラムは自分で更新できないものだから、最近使っていないようです。

まあ、7人しかいない営業の内2人がデータの持ち運びを希望しているので、更新プログラムをAccessで書くことにしました。

問題は2点ありました。
1.VBAのShellコマンドでリダイレクトが使えそうにない。
いつもダンプデータのリストアは
   psql DataBaseName -e < DumpData
としていましたが、「<」の部分がチョット動きそうにないので、pg_restoreコマンドを使おうと思いました。pg_restoreコマンドではダンプファイル名を-fオプションで指定できるので、リダイレクトは使用しなくても済みます。
しかし、やってみるとファイル名が見えないようで動作しません。
調べてみると
   psql -U postgres -h localhost -f DumpData DataBaseName
でリストアできることがわかり、解決。

2.パスワードを聞いてくる
Windows版のPostgreSQLでややこしいのはPostgreSQLを使用するpostgresユーザーがWindowsのユーザーアカウントから見えないことです。
PostgreSQLのインストール時にpostgresユーザーが作成されます。また、dropdb、cretedbなどのコマンドで-Uオプションでpostgresを指定します。このユーザーはWindowsのユーザーアカウントでは表示されません。
実際postgresをアカウントとしてWindowsに登録した後、PostgreSQLをインストール、WindowsとPostgreSQLのpostgresのパスワードを共通にしてインストールしてみても、postgresでログオンしたコマンドプロンプトでもdropdb、createdb時にはPostgreSQLのパスワードの入力を求められます。
じゃ、dropdb、createdb時にODBCドライバーの接続文字列のようにパスワードをshellコマンドに含ませることができるかというと、パスワードを設定できるオプションスイッチがありません。困った!

不思議だったのは自宅のパソコンで試した時はパスワードを聞いてきませんでした。それが会社でやるとパスワードを聞いてきます。どこが違うのかとゴチャ、ゴチャやっていると、pgAdminを使用する時にpostgresのパスワードを入力して保存するか、聞いてくるのに気が付きました。実際、一度、pgAdminでパスワードを入力してやると、コマンドプロンプトからパスワードの入力を求められなくなりました。
ネットで調べると結構、載っていてpgpass.confにパスワードが保存されることがわかりました。解決。

結局、shellコマンドの部分はたったこれだけでした。

Dim RetVal As Variant
Dim dtT1 As Date
Dim strFile As String
Dim dtT1 As Date

strPath = "C:Program FilesPostgreSQL8.1bin"
<strFile はダンプファイル名、コモンダイヤログから取得>

RetVal = Shell(strPath & "dropdb -U postgres -h localhost DataBaseName")

dtT1 = Now
T1:
If DateDiff("s", dtT1, Now) <5 Then GoTo T1

RetVal = Shell(strPath & "createdb -U postgres -h localhost DataBaseName")
dtT1 = Now
T2:
If DateDiff("s", dtT1, Now) <5 Then GoTo T2

RetVal = Shell(strPath & "psql -U postgres -h localhost -f  " & strFile & " DataBaseName")
dtT1 = Now

プログラム中、dropdb、createdbを実行した後、5秒ほど待っています。
createdbの後、処理が終了する前にリストアに処理に入ってしまうと、無視されてしまいます。チョット待たないとダメみたい。

(追記)
通常はクライアントサーバー型でデータベースを使用していて、Accessではリンクテーブルを使用しています。リンクテーブルではサーバー名がlocalhostにはなっていません。
サーバーがlocalhostであることを示してやらなければならないので、
C:\WINDOWS\system32\drivers\etc\lmhosts

127.0.0.1 クライアントサーバー型のサーバー名
を追加して、再起動します。