Saltar al contenido

PostgreSQL: cómo enumerar todas las funciones almacenadas que acceden a una tabla específica

Bienvenido a nuestra web, aquí vas a encontrar la respuesta de lo que necesitas.

Solución:

El cuerpo de una función simplemente se almacena como string. No hay una lista de objetos referenciados. (Eso es diferente de las vistas, por ejemplo, donde se guardan los enlaces reales a las tablas a las que se hace referencia).

Esta consulta por Postgres 10 o anterior utiliza la función de información del catálogo del sistema pg_get_functiondef() para reconstruir el CREATE FUNCTION script para funciones relevantes y busca el nombre de la tabla con una expresión regular que no distingue 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) ~* 'mbigM';

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 número de false 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 marcar 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, true Se agregaron procedimientos almacenados. Necesitas adaptarte. Relacionados:

  • ¿Cómo eliminar todas mis funciones en PostgreSQL?

Esta consulta es bastante fácil de usar:

SELECT proname, proargnames, prosrc FROM pg_proc WHERE prosrc ILIKE '%Text to search%';

Si guardas algún reparo o capacidad de arreglar nuestro artículo eres capaz de dejar una interpretación y con deseo lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.