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.