web-dev-qa-db-ja.com

postgresqlのCOPYコマンドがマップされたドライブのファイルで機能しないのはなぜですか

CSVファイルをネットワーク共有ドライブからpostgreSQLにコピーする際に問題が発生しました。現在の修正は、最初にファイルをローカルドライブにコピーすることですが、これはチェーン内の別のプロセスであり、乱雑になりすぎています。

次のコマンドを実行すると

  COPY test_schema.test FROM 'X:\_Postgres DBs\Testing\test_file.csv' 
  CSV HEADER;

私は得ます:

  ERROR:  could not open file "X:\_Postgres DBs\Testing\test_file.csv" 
  for reading: No such file or directory

わかりました。postgreSQLServerは、Windowsにマップされたドライブを理解できませんが、実行すると:

COPY test_schema.test FROM '\\ws7.domain.com\share-name\_Postgres
DBs\Testing\test_file2.csv' CSV HEADER;

私は得ます:

  ERROR:  could not open file "\\ws7.domain.com\share-name\_Postgres
  DBs\Testing\test_file2.csv" for reading: Permission denied

ファイルtest_file2.csvは、同じサーバー上でローカルに開くことができます。たとえば、notepad/notepad ++/wordpadを使用すると、「使用中のファイル」などのファイル属性がないように見えます。

誰でも共有ネットワークドライブでCOPYを使用する方法のヒントがありますか? (私たちのDB UIはDelphiでコーディングされているので、Delphiから呼び出すことができるpostgresqlスクリプトを使用する方法を探しています。それ以外の場合は、手間のかかるDelphi Firedacバッチコピーメソッドを記述する必要があります。)

3
Hamish_Fernsby

COPYはPostgreSQL serverとして実行されます。通常、WindowsではNETWORKSERVICEとして実行されます。これはローカルサービスアカウントです共有ドライブのユーザーアカウントのネットワークログイン認証情報にアクセスできません

psqlコマンド\copyを使用して、ユーザーIDで実行され、共有ドライブにアクセスできるクライアントアプリケーションからファイルを読み取り、クライアント/サーバーネットワーク接続を介してpostgresにストリーミングします。サーバ。

PgAdmin-IIIにも、psqlのCOPY ... FROM STDINと同様に\copyを使用する同様のCSVインポートコマンドがあると思います。

Windows ADドメインを使用していて、PostgreSQLが共有に直接アクセスできるようにする必要がある場合は、代わりにドメインアカウントでPostgreSQLサーバーを実行できます。しかし、それは通常不要です。

5
Craig Ringer