Introdução:
Banco de dados PostgreSQL com várias centenas de funções armazenadas, incluindo obsoletas, não usadas etc.
Problema
Preciso descobrir todas as funções armazenadas que tenham alguma relação com a tabela X - pois quero alterar a estrutura da tabela. Alguns deles podem não ser usados, então não posso fazer isso apenas olhando o código.
A solução que tenho no ATM está executando a saída do psql \df+
e do grepping, mas eu prefiro uma solução mais parecida com o banco de dados, ou seja, usando o esquema de informações. Esta será definitivamente uma tarefa repetitiva e eu gostaria de tê-la agradável e limpa.
Alguma sugestão?
O corpo de uma função é armazenado apenas como string . Não há lista de objetos referenciados. (Isso é diferente das visualizações, por exemplo, onde os links reais para as tabelas referenciadas são salvos.)
Esta consulta para Postgres 10 ou anterior usa a função de informações do catálogo do sistema
pg_get_functiondef()
para reconstruir oCREATE FUNCTION
script para funções relevantes e procura o nome da tabela com uma expressão regular que não diferencia maiúsculas de minúsculas:Deve fazer o trabalho, mas obviamente não é à prova de balas. Ele pode falhar para SQL dinâmico onde o nome da tabela é gerado dinamicamente e pode retornar qualquer número de falsos positivos - especialmente se o nome da tabela for uma palavra comum.
As funções agregadas e todas as funções dos esquemas do sistema são excluídas.
\m
e\M
marque o início e o fim de uma palavra na expressão regular.O catálogo do sistema foi
pg_proc
alterado no Postgres 11.proisagg
foi substituído porprokind
, foram adicionados procedimentos armazenados verdadeiros. Você precisa se adaptar. Relacionado:Esta consulta é muito fácil de usar: