sql >> Base de Datos >  >> RDS >> PostgreSQL

3 formas de enumerar todos los procedimientos almacenados que hacen referencia a una tabla en PostgreSQL

Aquí hay tres ejemplos de cómo devolver una lista de procedimientos almacenados que hacen referencia a una tabla específica en PostgreSQL.

El information_schema.routines Ver

Podemos consultar el information_schema.routines view para ver si alguna de las definiciones contiene el nombre de la tabla.

Ejemplo:

SELECT
    routine_name,
    routine_body,
    routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';

En este ejemplo, verifiqué si alguno de los procedimientos almacenados tenía el texto artists en su definición.

El ILIKE El operador hace que la coincidencia no distinga entre mayúsculas y minúsculas de acuerdo con la configuración regional activa. Esta es una extensión de PostgreSQL y no es parte del estándar SQL. Para una coincidencia entre mayúsculas y minúsculas, use LIKE .

Tenga en cuenta que no es perfecto, en el sentido de que podría devolver falsos positivos si el texto está en el procedimiento, pero no es una tabla. Para mitigar este riesgo, tal vez podría refinar los criterios de filtrado.

El pg_proc Catálogo

El pg_catalog.pg_proc El catálogo almacena información sobre funciones, procedimientos, funciones agregadas y funciones de ventana. Por lo tanto, podemos consultar así:

SELECT 
    n.nspname AS schema_name,
    p.proname AS function_name,
    pg_get_function_arguments(p.oid) AS arguments,
    p.prosrc AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';

En este caso, unimos el catálogo con el pg_catalog.pg_namespace catalog para filtrar los resultados a solo procedimientos con public espacio de nombres.

Alternativamente, podemos usar pg_get_functiondef() función para obtener la definición. Esta función en realidad reconstruye el comando de creación para el procedimiento almacenado. Es una reconstrucción descompilada, no el texto original del comando. Esto da como resultado un CREATE OR REPLACE PROCEDURE declaración para el procedimiento almacenado.

Ejemplo:

SELECT 
    n.nspname AS schema_name,
    p.proname AS function_name,
    pg_get_function_arguments(p.oid) AS arguments,
    pg_get_functiondef(p.oid) AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';

Obtener la línea específica que hace referencia a la tabla

Podemos modificar nuestra consulta para incluir el número de línea que hace referencia a la tabla:

SELECT *
FROM (
    SELECT 
        proname AS stored_procedure, 
        row_number() OVER (partition by proname) AS line_number, 
        textline
    FROM (
        SELECT 
            proname, 
            unnest(string_to_array(prosrc, chr(10))) AS textline
        FROM pg_proc p
        JOIN pg_namespace n ON n.oid = p.pronamespace
        WHERE nspname = 'public'
        AND prosrc ILIKE '%artists%'
        ) lines
    ) x
WHERE textline ILIKE '%artists%';

Este ejemplo se basa en una respuesta de Stack Overflow de Klin.