环境: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语句中调用它。
感谢。
答案 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