2012-09-29 27 views
1

需要使用SQL提取PostgreSQL函數的源代碼。postgresql提取函數源

我看到這個奇怪的行爲與其中一個功能,所有其他功能(大約200+)工作絕對好。

當我運行下面的語句,它的工作原理:

select prosrc from pg_proc where proname= 'accounts_count'; 

然而,當我運行下面的,它返回一個空字符串:

select routine_definition 
from information_schema.routines 
where specific_name = 'accounts_count_66243' 

PostgreSQL的8.3版本。我曾嘗試使用pgAdmin III和psql。

不是一個表演塞子,但會知道爲什麼這可能是有用的。

任何想法的人?

+0

什麼'select length(routine_definition)...'return? –

+0

從8.4開始,有'pg_get_functiondef()'。也許是更新到更新版本的另一個原因? –

回答

2

如果你看看INFORMATION_SCHEMA.ROUTINES的定義,那麼你可以找到以下過濾器:

FROM pg_namespace n, pg_proc p, pg_language l, pg_type t, pg_namespace nt 
WHERE n.oid = p.pronamespace AND p.prolang = l.oid AND p.prorettype = t.oid 
    AND t.typnamespace = nt.oid AND (pg_has_role(p.proowner, 'USAGE'::text) 
    OR has_function_privilege(p.oid, 'EXECUTE'::text)); 

所以我的理論:

  • 有相關功能的權利和所有權問題的一些(可能) - 嘗試使用不同的帳戶驗證這個理論(postgres是最好的)
+0

幹得好。原來是一個配股問題。功能所有者被設置爲不同的用戶。看起來如果該函數不屬於登錄用戶,則information_schema.routines不會在pg_proc執行時顯示源。奇。 – ManiP

+0

當然 - 請參閱http://www.postgresql.org/docs/9.2/static/infoschema-routines.html –