2012-08-30 49 views
0

環境:PostgreSQL的9.1獲取使用非超級用戶帳戶大對象的實際數據

爲pg 9.0,通過從pg_largeobject選擇相應的記錄得到TEXT字段可以做一個大對象的實際數據之前表。但是從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語句中調用它。

謝謝。

回答

1

爲什麼不看看Hibernate在幹什麼?

postgresql.conf設置log_statement = 'all'並重新加載或重新啓動PostgreSQL。在Hibernate中重新運行測試,看看發生了什麼。

在猜測我會說休眠是使用large object客戶端接口,特別是PgJDBC的large object support。或者,它可能使用JDBC-standard clob/blob interfaces來訪問數據。

+0

很好的建議克雷格。它調用了幾個lo_XXX()函數,但我不知道如何在PL/pgSQL函數中使用它們,以便我可以在select語句中簡單地調用它。 –

+0

@KenChan回答更新了建議 –

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

相關問題