Você só deve manipular os catálogos do sistema diretamente, se souber exatamente o que está fazendo. Pode ter efeitos colaterais inesperados. Ou você pode corromper o banco de dados (ou todo o cluster de bancos de dados) além do reparo.
A resposta de Jeremy , embora basicamente faça o truque, não é aconselhável para o público em geral. Altera incondicionalmente todas as funções em um esquema. Você tem certeza de que não há funções do sistema afetadas ou funções instaladas por um módulo adicional?
Também não faria sentido alterar o proprietário das funções que já pertencem ao proprietário designado.
Primeiro, verifique se REASSIGN OWNED
poderia funcionar para você:
alterar a propriedade dos objetos de banco de dados pertencentes a uma função de banco de dados
Você precisa listar todas as funções a serem rejeitadas explicitamente. Mas também reatribui funções .
Para atribuir todas as funções (e nenhum outro objeto) em um determinado esquema a um novo proprietário (opcionalmente independentemente do proprietário anterior):
SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'
Isso gera os comandos SQL canônicosALTER FUNCTION ...
para alterar todas as funções (no esquema especificado). Você pode inspecionar os comandos antes de executá-los - um por um ou todos de uma vez:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Incluí algumas WHERE
cláusulas comentadas que você pode usar para filtrar os resultados.
O elenco para regprocedure
produz um nome de função válido com parâmetros, aspas duplas quando necessário, esquema - qualificado quando necessário para a corrente search_path
.
A função agregada string_agg () requer o PostgreSQL 9.0 ou posterior. Na versão anterior, substitua porarray_agg()
e array_to_string()
.
Você pode colocar tudo isso em umDO
declaração ou função, como demonstrado nesta resposta relacionada:
No Postgres 9.5 ou posterior, você pode simplificar a consulta usando novos tipos de identificador de objeto regnamespace
eregrole
:
SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc
WHERE pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'
pg_proc.proisagg
é substituído na pg 11. As notas de lançamento dizem: substituir a tabela de sistemapg_proc
'sproisagg
eproiswindow
comprokind
(Peter Eisentraut) `