web-dev-qa-db-ja.com

psqlはCOPY FROMを使用するとファイルへのアクセスを拒否します

私がこれをするとき:

COPY "mytable" FROM '/my/file.csv' WITH DELIMITER AS ',' CSV;

これについて:

-rw-r--r-- 1 peter peter 54819176 2011-07-21 13:17 file.csv

psqlはこれを教えてくれます:

ERROR:  could not open file "/my/file.csv" for reading: Permission denied

ファイルを読み取るにはどうすればよいですか?ありがとう!

---更新

Ubuntuにはデフォルトでapparmorと呼ばれるものがインストールされているようです。
コメントで述べたように、SELinuxと同じ機能を持っているようです。

---更新

apparmorを削除した後も、同じ問題が発生します。 selinuxがインストールされていません。

アクセスに関する以下のコメントに関して、COPY FROMはスーパーユーザーアカウントから実行され(そうでない場合は別のエラーメッセージが表示されます)、上記でコピーしたファイルのアクセス許可は「誰でも読み取り可能」と理解しています。

---更新

postgresユーザーの下でファイルにアクセスしようとしました。木の特定の場所で動かなくなる

drwxr--r-- 6 peter peter 4096 2011-04-14 14:03 phm

postgres@dexter:/home/peter/PyPacks$ cd phm

bash: cd: phm: Permission denied

ファイルをどこかに置くだけだと思いますが、これは奇妙です!

6
Pete
drwxr--r-- 6 peter peter 4096 2011-04-14 14:03 phm

postgres@dexter:/home/peter/PyPacks$ cd phm

bash: cd: phm: Permission denied

Cdを実行するには(またはディレクトリ内のファイルを使用するには)、ディレクトリを実行可能にする必要があります。 /から/home/peter/PyPacks/phmまでのすべてのサブディレクトリは、これを機能させるために使用するユーザーが実行できる必要があります。

少なくともchmod 711 phm(これによりrwx--x--xが得られるはずです)、またはchmod 755 phmrwxr-xr-x)を試してください。ディレクトリのrは、それらのコンテンツにアクセスするのではなく、それらのコンテンツを一覧表示する機能です(またはその中のファイル/ディレクトリを使用します)。

7
Bruno

psqlコマンドラインツールを想定すると、copyの代わりに\copyを使用できます。

\copyは、ファイルを開いてコンテンツをサーバーにフィードしますが、copyは、サーバーにファイル自体を開いて読み取るよう指示します。これは、アクセス許可に問題があり、クライアントとサーバーの場合は不可能です。中間のファイル共有なしで、異なるマシンで実行します。

内部では、\copyCOPY FROM stdinとして実装され、サーバー側のCOPYと同じオプションを受け入れます。

from https://stackoverflow.com/questions/19463074/postgres-error-could-not-open-file-for-reading-permission-denied

4
spatialhast

Linuxでは、ユーザーpostgresにファイルを読み取り、ディレクトリを実行する権限が必要です。また、PSQLサーバーの再起動も必要です。

1
Darth Kangooroo

Macを使用している場合は、csvファイルを「/ tmp」ディレクトリに配置します。この場合、pgadminなどのすべてのユーザーがファイルにアクセスできます。

0
yasi_ensaf