1

環境:PostgreSQL 9.1

pg 9.0 より前では、テーブルTEXTから対応するレコードを選択すること で、ラージ オブジェクト フィールドの実際のデータを取得できました。pg_largeobjectしかし、pg 9.0 以降、非スーパーユーザーはこのテーブルにアクセスできなくなりました。

ただし、休止状態を使用すると、同じ非スーパーユーザー アカウントがこのTEXTフィールドの実際のデータにアクセスできます。そのため、非スーパーユーザー アカウントを使用すると、この TEXT フィールドの実際の内容を「選択」することもできると思います。どうすればいいですか?

Craig が提案したように、設定でログ収集をオンにするlog_statement = 'all'と、関連するログは次のようになります。

SELECT p.proname,p.oid  
FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n  
WHERE p.pronamespace=n.oid AND n.nspname='pg_catalog' 
AND ( proname = 'lo_open' or proname = 'lo_close' or proname = 'lo_creat' or proname = 'lo_unlink' 
or proname = 'lo_lseek' or proname = 'lo_tell' or proname = 'loread' or proname = 'lowrite'
 or proname = 'lo_truncate')

2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_open" (OID 952)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_open" (OID 952)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_lseek" (OID 956)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_tell" (OID 958)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_lseek" (OID 956)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_tell" (OID 958)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_lseek" (OID 956)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "loread" (OID 954)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "loread" (OID 954)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "loread" (OID 954)
2012-08-31 09:27:05 HKT LOG:  fastpath function call: "lo_close" (OID 953)

複数の lo_XXX() 関数を呼び出しますが、 select ステートメントで簡単に呼び出せるように PL/pgSQL 関数として作成する方法がわかりません。

ありがとう。

4

2 に答える 2

1

Hibernate が何をしているか見てみませんか?

postgresql.conf設定して、log_statement = 'all'PostgreSQL をリロードまたは再起動します。Hibernate でテストを再実行し、何が起こっているかを確認します。

推測では、Hibernate はラージ オブジェクトクライアント インターフェイス、特に PgJDBC のラージ オブジェクト サポートを使用していると言えます。または、 JDBC 標準の clob/blob インターフェイスを使用してデータにアクセスしている可能性があります。

于 2012-08-30T10:40:00.907 に答える
0

ラージ オブジェクトに関するドキュメントを読んで、あなたの質問に対する答えを見つけました。lo_compat_privileges は、postgresql.conf の変数です。この変数は、値を on または off にすることができます。デフォルトはオフです。オンはあなたが期待していたものです。デフォルト値を使用すると、バージョン 9.0 より前には存在しなかった Postgresql セキュリティ チェックが実行されます。この変数の値が「on」の場合、新しいセキュリティ チェックの大部分は実行されません: http://www.postgresql.org/docs/9.2/static/runtime-config-compatible.html#GUC-LO-COMPAT-特権

セキュリティ チェックは postgresql にとどまるためにあります。したがって、新しいセキュリティ チェックを有効にして GRANT オプションを使用できるようにするための最良のソリューションとなります。

よろしくお願いいたします。

ルック

于 2012-10-04T13:23:27.327 に答える