2011年7月14日木曜日

PostgreSQLでpsql以外からCOPY FROM/TO を使う

PostgreSQLで便利なCOPY文。
でも、COPY FROM/TO 'ファイル名'を使うにはスーパーユーザ(superuser)権限が必要…。
ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
なんでもかんでもスーパーユーザにするのはよくないので、なにか方法はないかと調べてみた。

一つは\copyを使う方法。
C言語でlibpqを使って繋げているので、「単純にcopyを\copyにすればいいのか?」と思い試してみたが、やっぱりダメ。
そう簡単ではありません。
要は\copyはpsqlのコマンドであり、PostgreSQLに取っては分からないコマンドになってしまうから。

もう一つは、ヒントにも書かれているstdout, stdinを使う方法。
C言語からどうやればいいんだろう?
ということで、公式のドキュメントを参照。
http://www.postgresql.jp/document/9.0/html/libpq-copy.html

PQPutCopyData関数を使えばいいらしい。
ただいきなり発行できるわけではなく、まずCOPY_IN状態にしなくちゃならない。
COPY_IN状態にするにはどうしたらいいかというと、普通にPQExecで"COPY FROM STDIN..."を実行させればいいだけ。
こうなってからPQPutCopyData関数を使えばstdinから入れているように見せられる、とそういうわけか。

ここまで調べて、さあ実装しよう!と思ったら、上司から「そのユーザ、スーパーユーザにしちゃっていいよ」とのお言葉…。
まぁ、他にもいろいろあるユーザだし、プログラムの実行しかしないログインも出来ないユーザだからいいっちゃいいけどね。

ちょっと拍子抜けでした!

0 件のコメント: