私がこれをするとき:
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
ファイルをどこかに置くだけだと思いますが、これは奇妙です!
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 phm
(rwxr-xr-x
)を試してください。ディレクトリのr
は、それらのコンテンツにアクセスするのではなく、それらのコンテンツを一覧表示する機能です(またはその中のファイル/ディレクトリを使用します)。
psql
コマンドラインツールを想定すると、copy
の代わりに\copy
を使用できます。
\copy
は、ファイルを開いてコンテンツをサーバーにフィードしますが、copy
は、サーバーにファイル自体を開いて読み取るよう指示します。これは、アクセス許可に問題があり、クライアントとサーバーの場合は不可能です。中間のファイル共有なしで、異なるマシンで実行します。
内部では、\copy
はCOPY FROM stdin
として実装され、サーバー側のCOPY
と同じオプションを受け入れます。
Linuxでは、ユーザーpostgresにファイルを読み取り、ディレクトリを実行する権限が必要です。また、PSQLサーバーの再起動も必要です。
Macを使用している場合は、csvファイルを「/ tmp」ディレクトリに配置します。この場合、pgadminなどのすべてのユーザーがファイルにアクセスできます。