質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

4回答

2569閲覧

一般ユーザでDBに画像を保存したい

salmonzushi

総合スコア8

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/10/17 06:42

編集2018/10/18 04:50

前提・実現したいこと

画像ファイル(とても小さいサイズ)をPostgreSQLに保存したい。
スーパーユーザを使わずに行いたい。
(事前準備としてスーパーユーザを使う事は可能。)

発生している問題

byteaのカラムを作り、pg_read_binary_fileを使用してみましたが、スーパーユーザでないと使えないようでした。
また、こちらの回答のベストアンサーを試してみましたが、lo_importを行うのにスーパーユーザが必要のようでした。

補足情報(FW/ツールのバージョンなど)

PostgreSQL 9.2.4
DBサーバ CentOS7

追記

コピペできない環境だったので、情報量の少ない質問になってしまい、申し訳なかったです。

ご指摘の通りユーザにUPDATE権限がなかったので追加しましたが、エラー内容は変わりませんでした。

使用ユーザの作成テーブルへの権限はUPDATEとINSERTです。

●関数(スーバーユーザで実行)

create or replace function bytea_import(p_path text, p_result out bytea) language plpgsql as $$ declare l_oid oid; begin select lo_import(p_path) into l_oid; select lo_get(l_oid) INTO p_result; perform lo_unlink(l_oid); end;$$;

●テーブルクリエイト文

create table mst_table ( e_id integer primary key, file_no integer default 0 not null, file_name text , file_data bytea );

●一般ユーザでpsqlから下記を実行

database=> INSERT INTO mst_table (e_id, file_no, file_name, file_data) database-> SELECT database-> nextval('seq_id'), database-> nextval('seq_no'), database-> 'file.jpg', database-> bytea_import('/home/appuser/tool/images/file.jpg'); ERROR: must be superuser to use server-side lo_import() HINT: Anyone can use the client-side lo_import() provided by libpq. CONTEXT: SQL statement "select lo_import(p_path)" PL/pgSQL function bytea_import(text) line 5 at SQL statement database=>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

自己解決

回答くださった方々ありがとうございます。
どれをベストアンサーにして良いか分からなかったので、自己解決とさせて頂きました。

サーバーサイドで画像を直接INSERTする場合は、スーパーユーザーでないといけない。
→直接INSERTしないでlibpq(Cプログラム?)などを使用する。
→byteaではなくラージオブジェクトを使う。

辺りが解決策かと思いました。

投稿2018/10/18 19:10

salmonzushi

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

別件ですが、画像のinsertできた場合、とくに問題ないとおもいますがselectで抽出した場合
少し工夫が必要かもしれません。私もbytea型に画像(jpg)をいれていざ、DBからselectし画像を
表示しようと試みましたができませんでした。マニュアルを確認すると16進から8進に変換されていて
なおかつ最初のバイト配列に”’”が挿入されてました。つまり読み込んだ大きさは、挿入時の大きさ×2+1
byteになっていました。これをもとの大きさに編集し画像形式に変換する作業が発生しました。
この時に利用した、postgresのバージョンは9.6です。(言語は、vb.net)

投稿2018/10/18 07:16

akirafudo6

総合スコア341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salmonzushi

2018/10/18 19:01

情報ありがとうございます。 確かに普通にselectしても元に戻らなかったですね。 取得アプリ作成は別の方なので、スーパーユーザで作成したDBデータを渡したところ、問題なく取得できたそうです。(Python3)
guest

0

lo_importを行うのにスーパーユーザが必要のようでした。

その時のエラーメッセージを省略しないで質問に追記されては?
差支えない範囲で、実際に実行したコードとCREATE TABLE も追記した方が解決が早いのでは?

投稿2018/10/17 08:37

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akirafudo6

2018/10/17 08:52

ラージオブジェクトの操作か..無理みたいですね...
salmonzushi

2018/10/18 02:38

ご指摘ありがとうございます。 エラーメッセージ等を追記しました。
Orlofsky

2018/10/18 03:24

SQLで使われるテーブルはCREATE TABLEされている必要があります。だからテーブルの説明ではなくCREATE TABLE文を載せては?って書きました。 >ERROR: must be superuser to use server-side lo_import() superuser でないと使えません、って怒られています。 [PL/pgSQL]タグを追加されては? PostgreSQLの環境はないのでためしていませんが、画像をBLOB型のカラムで使えないか、ググって試してみては?
salmonzushi

2018/10/18 04:44 編集

失礼しました。 取り急ぎ、テーブルクリエイト文に修正しました。 また、PL/pgSQLのタグを追加してみました。 BLOB型のbyteaに画像を登録する方法は、調べた限りは質問文の方法(スーパーユーザが必要)でした。 もう一つラージオブジェクトを使う方法がありましたが、テーブルを変更しないといけない為、bytea型に入れる方法が見つからなかったらラージオブジェクトに変更しようと思います。 自分でも調べてみます。
akirafudo6

2018/10/18 07:20

サーバーサイトで画像を直接insertする場合は、スーパーユーザーでないとだめってことですね!
Orlofsky

2018/10/18 07:41

英字を全角文字で記述するのは止めませんか?
akirafudo6

2018/10/18 07:49

ごめんなさい。あまり意識してなかった!読みづらいのかな?
guest

0

それは、スーパーユーザで使えないという理由でなくて、利用したいユーザーの権限の問題ではないでしょうか?おそらくそのユーザーはupdate権限を持たせていないのではないでしょうか?

投稿2018/10/17 08:03

akirafudo6

総合スコア341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salmonzushi

2018/10/18 02:40

ご指摘ありがとうございます。 UPDATE権限がなかったので追加しました。 しかしエラーは出てしまいました。 エラーメッセージ等の情報を追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問