マンガでよめる痔のこと・薬のこと

(Linux、データベース初心者)スクリプトを実行するとPermission deniedが発生します。

Postgresql psqlに関して
よろしくお願いします。

UbuntuサーバにインストールしたPostgresqlに対し、スクリプトを実行してcsvファイルをインポートしようと考えています。
その際にPermission deniedが発生しテーブルにデータが入りません。

以下にスクリプトファイルとエラーメッセージを掲載します。
<test.sh>
#!/bin/bash
#接続文字列
export PGHOST="ホスト名”
export PGPORT="ポート番号"
export PGDATABASE="データベース名"
export PGUSER="ユーザー名"
export PGPASSWORD="パスワード"

PSQL='COPY bat_test FROM ' '''/test/test.csv''' ' with DELIMITER ' ''','''
echo "$PSQL" | psql
echo "commit" | psql
<以上、test.sh>
<エラーメッセージ>
test.sh:/test/test.csv:Permission denide
<以上、エラーメッセージ>

インポートしたいファイルの権限等は確認しましたがわかりませんでした。
何が悪いのかご指摘いただければ助かります。

どうか、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

bash等のB sh系では


変数名=値 コマンド....
とすると、変数に値を(一時的に)設定してコマンドを実行します。

> PSQL='COPY bat_test FROM ' '''/test/test.csv''' ' with DELIMITER ' ''','''
この文ですが、環境変数
PSQL='COPY bat_test FROM '
をセットした状態で
'''/test/test.csv''' ' with DELIMITER ' ''','''
を実行する、という意味になります。
'は 2つずつペアになるので
''が空文字列
'/test/test.csv'が/test/test.csv
''が空文字列
となり、 /test/test.csv がコマンドとして実行されます。
が、実際には実行属性が無いので permission denided になります。
(実行属性があったとしても、test.csvが実行できるとは思いませんが)

この行全体をPSQL変数に設定したいのなら
PSQL="'COPY bat_test FROM ' '''/test/test.csv''' ' with DELIMITER ' ''','''"
と、全体をダブルクォートでくくるとか
PSQL='COPY bat_test FROM '\ '''/test/test.csv'''\ ' with DELIMITER '\ ''','''
と、スペースを\でエスケープて、単語の区切りとしての意味を無効にします。

ところで、'''を、 'の中に'を入れる目的で使ってませんか?
VisualBasic等はそういう書き方をしますが、bashではその意味では使えません。
'のなかに'は書けないので、全体をダブルクォートでくくる
PSQL="COPY bat_test FROM '/test/test.csv' with DELIMITER ','"
とか、シングルクォートの前でいったんシングルクォートを閉じて、"'"か\'でシングルクォートを単独で使い、再びシングルクォートを始める
PSQL='COPY bat_test FROM '\''/test/test.csv'\'' with DELIMITER '\'','\'
とかします。

#等幅フォントで見ないとわかりずらいものになってしまいました。
    • good
    • 0
この回答へのお礼

間違いの指摘だけでなく、
私が誤解していた部分まで教えていただきありがとうございました。
大変判りやすく、すごく助かりました。

もっと作法を勉強しなくては…

お礼日時:2010/04/09 09:18

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルに記述されている複数のSQL文を一度に実行させたい

こんにちわ。

ファイルに記述されているSQL文を、Linuxのコマンドラインなどから
実行したいと考えています。

ファイルに
insert into DB_NAME(aaa,bbb,ccc) values(111,222,333);
insert into DB_NAME(ddd,eee,fff) values(333,777,222);
insert into DB_NAME(aaa,ttt,ddd) values(111,000,999);
...

などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して
なんかしらの方法で一度に実行させたいのです。

mySQLでは、このようなやり方があるのですが
postgreではどのようにすればいいのか、わかりません。

どなたかご存知の方、よろしくお願い致します。

OSはLinuxです。

Aベストアンサー

#1の方も指摘されている通り、 psql を使えば出来ます。

psql で、-f オプションを使うか、該当のDBに接続して \i コマンドを使えば良いでしょう。
http://www.postgresql.jp/document/pg746doc/html/app-psql.html

SQLが記述されているファイルを insert_data.sql、
DBを testdb としますと
例1)-------------------------------------------------------------
$ psql testdb
Welcome to psql x.x.x, the PostgreSQL interactive terminal.




testdb=> \i insert_data.sql
testdb=> \q
-----------------------------------------------------------------

例2)-------------------------------------------------------------
$ psql testdb -f insert_data.sql
-----------------------------------------------------------------

注) ユーザのDBへのアクセス権によっては -U オプションや -W オプションも必要になります。

#1の方も指摘されている通り、 psql を使えば出来ます。

psql で、-f オプションを使うか、該当のDBに接続して \i コマンドを使えば良いでしょう。
http://www.postgresql.jp/document/pg746doc/html/app-psql.html

SQLが記述されているファイルを insert_data.sql、
DBを testdb としますと
例1)-------------------------------------------------------------
$ psql testdb
Welcome to psql x.x.x, the PostgreSQL interactive terminal.




testdb=> \i insert_data.sql
testdb=> \q...続きを読む


人気Q&Aランキング