El cuerpo de una función solo se almacena como una cadena . No hay una lista de objetos referenciados. (Eso es diferente de las vistas, por ejemplo, donde se guardan los enlaces reales a las tablas referenciadas).
Esta consulta para Postgres 10 o anterior utiliza la función de información del catálogopg_get_functiondef()
del sistema para reconstruir el CREATE FUNCTION
script para funciones relevantes y busca el nombre de la tabla con una expresión regular que no distinga entre mayúsculas y 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';
Debería hacer el trabajo, pero obviamente no es a prueba de balas. Puede fallar para SQL dinámico donde el nombre de la tabla se genera dinámicamente y puede devolver cualquier cantidad de falsos positivos, especialmente si el nombre de la tabla es una palabra común.
Se excluyen las funciones agregadas y todas las funciones de los esquemas del sistema.
\m
y\M
marque el principio y el final de una palabra en la expresión regular.
El catálogo del sistema pg_proc
cambiado en Postgres 11. proisagg
fue reemplazado por prokind
, se agregaron verdaderos procedimientos almacenados. Necesitas adaptarte. Relacionado:
EXECUTE
expresiones como'mm_'||name_parameter
, y no hará frente correctamente a los nombres citados como"my""table""
o con mayúsculas y minúsculas, pero hará lo que la mayoría de la gente querrá .