如何在postgres中更改函数的所有者

时间:2014-04-02 06:24:39

标签: postgresql-9.2

我正在编写一个脚本来改变postgres的所有功能(更改每个函数的所有者)。我可以使用postgres查询列出所有函数名称,但不能列出每个函数的参数。

如果我得到以下任何问题的解决方案,我的问题将得到解决:

  1. 有没有办法在每个函数中列出参数的数据类型。
  2. 我们是否有任何改变功能的方法,而不是传递参数类型,我可以发送一些外卡。 例如,我可以写 ALTER FUNCTION schemaname.func(text)拥有'newowner'的所有者 如: ALTER FUNCTION schemaname.func(*)所有者都是'newowner'。

2 个答案:

答案 0 :(得分:11)

  

有没有办法列出参数'每个函数中的数据类型。

是的,使用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,以便在您需要定期的情况下使生活更轻松。

答案 1 :(得分: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';