Postgres a une fonction dédiée à cet effet. Introduit avec Postgres 8.4. Le manuel :
pg_get_function_identity_arguments(func_oid)
... obtenir la liste des arguments pour identifier une fonction (sans valeurs par défaut) ...
pg_get_function_identity_arguments
renvoie l'argument listnécessaire pour identifier une fonction, sous la forme qu'il devrait apparaître dansALTER FUNCTION
, par exemple. Ce formulaire omet les valeurs par défaut.
En utilisant cela (et format()
, introduit avec Postgres 9.1), la requête suivante génère des instructions DDL pour supprimer les fonctions correspondant à vos termes de recherche :
SELECT format('DROP %s %I.%I(%s);'
, CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
, n.nspname
, p.proname
, pg_catalog.pg_get_function_identity_arguments(p.oid)
) AS stmt
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE p.proname = 'dblink' -- function name
-- AND n.nspname = 'public' -- schema name (optional)
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER BY 1;
Le catalogue système pg_proc
modifié dans Postgres 11 . proisagg
a été remplacé par prokind
, de véritables procédures stockées ont été ajoutées. Vous devez vous adapter. Voir :
- Comment supprimer toutes mes fonctions dans PostgreSQL ?
Renvoie :
stmt
---------------------------------------------------
DROP FUNCTION public.dblink(text);
DROP FUNCTION public.dblink(text, boolean);
DROP FUNCTION public.dblink(text, text);
DROP FUNCTION public.dblink(text, text, boolean);
Trouvé quatre correspondances dans l'exemple car dblink utilise des fonctions surchargées.
Exécutez DROP
déclarations de manière sélective !
Alternativement , vous pouvez utiliser la conversion pratique en type d'identifiant d'objet regprocedure
qui renvoie une signature de fonction complète incluant les types d'argument :
-- SET LOCAL search_path = ''; -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
, CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
, oid::regprocedure
) AS stmt
FROM pg_catalog.pg_proc
WHERE proname = 'dblink' -- function name
ORDER BY 1;