O Stack Overflow Q & A Modify OWNER em todas as tabelas simultaneamente no PostgreSQL descreve algumas maneiras bacanas de alterar a tabela e outros objetos para um usuário específico e funciona perfeitamente, no entanto, todas as sugestões parecem ignorar as funções que criei.
Existe uma maneira bastante fácil de redefinir o proprietário de TODOS os objetos no banco de dados, incluindo as funções? Fazer isso manualmente é altamente indesejável.
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 banco 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. Ele altera incondicionalmente todas as funções em um esquema. Tem certeza de que não há funções do sistema afetadas ou funções instaladas por um módulo adicional?
Também seria inútil alterar o proprietário de funções que já pertencem ao proprietário designado.
Primeiro, verifique se
REASSIGN OWNED
pode funcionar para você:Você deve 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):
Isso gera os comandos SQL canônicos
ALTER FUNCTION ...
para alterar todas as funções (no esquema especificado). Inspecione os comandos antes de executar - um por um ou todos de uma vez:A conversão para
regprocedure
produz um nome de função válido com parâmetros, entre aspas duplas quando necessário, qualificado pelo esquema quando necessário para osearch_path
.Também usando os tipos de identificador de objeto
regnamespace
eregrole
para simplificar.Adicionei algumas cláusulas comentadas
WHERE
que você pode querer usar para filtrar os resultados.Você pode colocar tudo isso em uma
DO
declaração ou função, como demonstrado nesta resposta relacionada:Para Postgres 9.4 ou mais antigo :
A função agregada
string_agg()
requer PostgreSQL 9.0 ou posterior. Na versão mais antiga, substitua porarray_agg()
earray_to_string()
.Utilizo esta função para alterar o dono de tabelas, funções, tipos, etc. Você pode alterar a consulta dos cursores para adaptá-la às suas necessidades.
Então eu apenas executo (se você quiser depurar a saída, simplesmente defina o segundo parâmetro como verdadeiro):
Isso deve funcionar para as funções:
apenas despeje o esquema do banco de dados e use GnSa ou "Grep n Sed away"
Bem, não encontrei um processo de uma etapa, mas isso cuida de todos os objetos que posso ver em meu banco de dados: