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 FUNCTIONscript 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.
\me\M marque o início e o fim de uma palavra na expressão regular.
O catálogo do sistema pg_procalterado no Postgres 11. proisaggfoi substituído por prokind, procedimentos armazenados verdadeiros foram adicionados. Você precisa se adaptar. Palavras-chave:
EXECUTEexpressõ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 .