使用非超级用户帐户获取大对象的实际数据

时间:2012-08-30 08:55:24

标签: sql database hibernate postgresql plpgsql

环境:PostgreSQL 9.1

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

但是,通过使用hibernate,相同的非超级用户帐户可以访问此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()函数,但我不知道如何将它作为PL / pgSQL函数,这样我就可以在select语句中调用它。

感谢。

2 个答案:

答案 0 :(得分:1)

为什么不看看Hibernate在做什么?

postgresql.conf设置log_statement = 'all'并重新加载或重新启动PostgreSQL。在Hibernate中重新运行测试,看看发生了什么。

我想说Hibernate正在使用large object客户端接口,特别是PgJDBC的large object support。或者,它可能正在使用JDBC-standard clob/blob interfaces来访问数据。

答案 1 :(得分:0)

阅读有关大型对象的文档我遇到了问题的答案: lo_compat_privileges,这是postgresql.conf中的一个变量。 此变量可以打开或关闭值。默认为关闭,开启是您所期望的。使用默认值执行Postgresql安全检查,这些检查在9.0版之前不存在。如果此变量的值为' on'是未执行的大多数新安全检查: http://www.postgresql.org/docs/9.2/static/runtime-config-compatible.html#GUC-LO-COMPAT-PRIVILEGES

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

亲切的问候,

Loek