从 PostgreSQL 9.0 开始,非超级用户无法访问pg_largeobject
。这在发行说明中有记录:
添加控制大对象 (BLOB) 权限的功能
授予/撤销(KaiGai Kohei)
以前,任何数据库用户都可以读取或修改任何大型对象。
现在可以按大数据授予和撤销读取和写入权限
对象,并跟踪大对象的所有权。
如果它适用于您的开发实例,则可能是因为它的版本8.4
或更低,或者因为您以超级用户身份登录。
如果您无法以超级用户身份登录 heroku,我想您可以使用以下命令转储远程数据库pg_dump
,然后在本地重新加载它,将泄漏的 OID 识别为本地超级用户,将它们放入带有以下命令的脚本中:lo_unlink
命令,最后针对 heroku 实例运行此脚本。
Update:
基于psql如何\dl
命令查询数据库,看来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
可以添加以过滤特定用户拥有的大型对象。