2014-04-02 36 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';