1

环境:PostgreSQL 9.1

TEXT在 pg 9.0 之前,可以通过从 pg_largeobject表中选择相应的记录来获取大对象字段的实际数据。但是从 pg 9.0 开始,非超级用户不再允许访问该表。

但是,通过使用hibernate,相同的非超级用户帐户可以访问该TEXT字段的实际数据。所以我相信使用非超级用户帐户也可以“选择”该TEXT字段的实际内容。我该怎么做?

正如克雷格所建议的,我通过设置打开日志收集,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() 函数,但我不知道如何将其作为 PL/pgSQL 函数,以便我可以在 select 语句中简单地调用它。

谢谢。

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。默认为关闭,打开是您所期望的。使用默认值执行 Postgresql 安全检查,这在 9.0 版之前不存在。如果此变量的值为“on”,则大多数新的安全检查未执行: http ://www.postgresql.org/docs/9.2/static/runtime-config-compatible.html#GUC-LO-COMPAT-特权

安全检查保留在 postgresql 中,因此将是启用新安全检查并使用 GRANT 选项的最佳解决方案。

亲切的问候,

洛克

于 2012-10-04T13:23:27.327 回答