PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

3 façons de répertorier toutes les procédures stockées qui référencent une table dans PostgreSQL

Voici trois exemples de renvoi d'une liste de procédures stockées faisant référence à une table spécifique dans PostgreSQL.

Les information_schema.routines Afficher

Nous pouvons interroger les information_schema.routines vue pour voir si l'une des définitions contient le nom de la table.

Exemple :

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

Dans cet exemple, j'ai vérifié si l'une des procédures stockées avait le texte artists dans leur définition.

Le ILIKE L'opérateur rend la correspondance insensible à la casse en fonction des paramètres régionaux actifs. Ceci est une extension PostgreSQL et ne fait pas partie du standard SQL. Pour une correspondance sensible à la casse, utilisez LIKE .

Notez qu'il n'est pas parfait, dans le sens où il pourrait renvoyer des faux positifs si le texte est dans la procédure, mais ce n'est pas un tableau. Pour atténuer ce risque, vous pourriez peut-être affiner les critères de filtrage.

Le pg_proc Catalogue

Le pg_catalog.pg_proc catalogue stocke des informations sur les fonctions, les procédures, les fonctions d'agrégation et les fonctions de fenêtre. On peut donc interroger comme ceci :

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%';

Dans ce cas, nous joignons le catalogue avec le pg_catalog.pg_namespace catalogue pour filtrer les résultats aux seules procédures avec le public espace de noms.

Nous pouvons alternativement utiliser le pg_get_functiondef() fonction pour obtenir la définition. Cette fonction reconstruit en fait la commande de création de la procédure stockée. C'est une reconstruction décompilée, pas le texte original de la commande. Cela se traduit par une CREATE OR REPLACE PROCEDURE instruction pour la procédure stockée.

Exemple :

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%';

Obtenir la ligne spécifique qui référence la table

Nous pouvons modifier notre requête pour inclure le numéro de ligne qui fait référence à la table :

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%';

Cet exemple est basé sur une réponse Stack Overflow de Klin.