O corpo de uma função é apenas armazenado 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 o Postgres 10 ou anterior usa a função de informações do catálogopg_get_functiondef()
do sistema para reconstruir o CREATE 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:
SELECT n.nspname AS schema_name
, p.proname AS function_name
, pg_get_function_arguments(p.oid) AS args
, pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
AND pg_get_functiondef(p.oid) ~* '\mbig\M';
Deveria fazer o trabalho, mas obviamente não é à prova de balas. Pode falhar no 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.
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 pg_proc
alterado no Postgres 11. proisagg
foi substituído por prokind
, procedimentos armazenados verdadeiros foram adicionados. Você precisa se adaptar. Palavras-chave:
EXECUTE
expressões como'mm_'||name_parameter
, e não lidará corretamente com nomes citados como"my""table""
ou com dobras de maiúsculas e minúsculas, mas fará o que a maioria das pessoas deseja .