PostgreSQL 9.0 以降、非スーパーユーザーは にアクセスできませんpg_largeobject
。これは、リリース ノートに記載されています。
GRANT/REVOKE でラージオブジェクト (BLOB) パーミッションを制御する機能を追加 (KaiGai Kohei)
以前は、すべてのデータベース ユーザーがラージ オブジェクトの読み取りまたは変更を行うことができました。大きなオブジェクトごとに読み取りと書き込みのアクセス許可を付与および取り消すことができるようになり、大きなオブジェクトの所有権が追跡されます。
開発インスタンスで動作する場合は、バージョン8.4
以下か、スーパーユーザーとしてログインしていることが原因です。
heroku でスーパーユーザーとしてログインできない場合は、リモート データベースを でダンプし、pg_dump
ローカルでリロードし、リークされた OID をローカル スーパーユーザーとして識別し、lo_unlink
コマンドを使用してスクリプトに入れ、最後にこれを再生できます。 heroku インスタンスに対するスクリプト。
アップデート:
\dl
psqlコマンドがデータベースにクエリを実行する方法に基づいて、次のクエリpg_catalog.pg_largeobject_metadata
を使用して、すべての大きなオブジェクトの OID と所有権を取得するために使用できるようです。
SELECT oid as "ID",
pg_catalog.pg_get_userbyid(lomowner) as "Owner",
pg_catalog.obj_description(oid, 'pg_largeobject') as "Description"
FROM pg_catalog.pg_largeobject_metadata ORDER BY oid
したがって、リークされた大きなオブジェクトを見つける最初のクエリは、9.0 以降の非スーパーユーザー向けに次のように変更できます。
select oid from pg_largeobject_metadata
Where oid Not In (select id from table )
必要に応じて、条件をlomowner
追加して、特定のユーザーが所有する大きなオブジェクトをフィルター処理できます。