2014-04-02 35 views
2

我正在編寫腳本來更改postgres的所有函數(更改每個函數的所有者)。我能夠使用postgres查詢列出所有函數名稱,但無法列出每個函數的參數。如何在postgres中更改函數的所有者

,如果我得到任何的下文提到的問題,解決我的問題將得到解決:

  1. 有沒有辦法在每個功能列出下來參數的數據類型。
  2. 我們是否有任何方法來改變功能,而不是傳遞參數類型,我可以發送一些通配符。 例如,我可以編寫 ALTER FUNCTION schemaname.func(文本)OWNER TO'newowner' as: ALTER FUNCTION schemaname.func(*)OWNER TO'newowner'。

回答

8

Is there any way to list down parameters' data type in each of the function.

是,使用pg_get_function_identity_arguments()功能:

下面創建一個SQL腳本來改變從someschema模式中的所有功能:

select 'alter function '||nsp.nspname||'.'||p.proname||'('||pg_get_function_identity_arguments(p.oid)||') owner to newowner;' 
from pg_proc p 
    join pg_namespace nsp ON p.pronamespace = nsp.oid 
where nsp.nspname = 'someschema'; 

可以閥芯的輸出到一個文件中,然後運行生成的腳本。

如果您的函數名稱需要引用,則可能需要使用quote_ident來連接函數名稱。

如果您需要定期使用此功能,可以將所有這些功能封裝到一個功能中,並使用動態SQL使生活更輕鬆。

+0

這個特殊的語法對我來說不起作用(PostgreSQL 9.4.8,'ERROR:語法錯誤'或'near''newowner''')。我不得不刪除在新東家附近的引文,也就是所有者對新東主的引用; –

0

我有同樣的問題,但pg_get_function_identity_arguments(p.oid)沒有爲我工作。所以我用oidvectortypes(p.proargtypes)替換了該函數。

select 'alter function '||nsp.nspname||'.'||p.proname||'('||oidvectortypes(p.proargtypes)||') owner to newowner;' 
from pg_proc p 
join pg_namespace nsp ON p.pronamespace = nsp.oid 
where nsp.nspname = 'someschema';