Requête de base
Cette requête crée toutes les instructions DDL nécessaires :
SELECT 'DROP FUNCTION ' || oid::regprocedure
FROM pg_proc
WHERE proname = 'my_function_name' -- name without schema-qualification
AND pg_function_is_visible(oid); -- restrict to current search_path
Sortie :
DROP FUNCTION my_function_name(string text, form text, maxlen integer);
DROP FUNCTION my_function_name(string text, form text);
DROP FUNCTION my_function_name(string text);
Exécutez les commandes après avoir vérifié la plausibilité.
Passez le nom de la fonction sensible à la casse et sans guillemets doubles ajoutés à comparer avec pg_proc.proname
.
Le cast vers le type d'identifiant d'objet regprocedure
(oid::regprocedure
), puis à text
implicitement, produit des noms de fonctions avec des types d'arguments, automatiquement entre guillemets doubles et qualifiés par le schéma selon le search_path
actuel là où c'est nécessaire. Pas d'injection SQL possibles.
pg_function_is_visible(oid)
limite la sélection aux fonctions dans le search_path
actuel ("visible"). Vous pouvez ou non vouloir cela.
Si vous avez plusieurs fonctions du même nom dans plusieurs schémas, ou des fonctions surchargées avec différents arguments de fonction, tous d'entre eux seront répertoriés séparément. Vous voudrez peut-être restreindre à des schémas spécifiques ou à des paramètres de fonction spécifiques.
Connexe :
- Quand/comment les fonctions d'expression de valeur par défaut sont-elles liées par rapport à search_path ?
Fonction
Vous pouvez construire un plpgsql
fonction autour de cela pour exécuter les instructions immédiatement avec EXECUTE
. Pour Postgres 9.1 ou plus tard :Attention ! Il supprime vos fonctions !
CREATE OR REPLACE FUNCTION f_delfunc(_name text, OUT functions_dropped int)
LANGUAGE plpgsql AS
$func$
-- drop all functions with given _name in the current search_path, regardless of function parameters
DECLARE
_sql text;
BEGIN
SELECT count(*)::int
, 'DROP FUNCTION ' || string_agg(oid::regprocedure::text, '; DROP FUNCTION ')
FROM pg_catalog.pg_proc
WHERE proname = _name
AND pg_function_is_visible(oid) -- restrict to current search_path
INTO functions_dropped, _sql; -- count only returned if subsequent DROPs succeed
IF functions_dropped > 0 THEN -- only if function(s) found
EXECUTE _sql;
END IF;
END
$func$;
Appel :
SELECT f_delfunc('my_function_name');
La fonction renvoie le nombre de fonctions trouvées et supprimées si aucune exception n'est déclenchée. 0
si aucun n'a été trouvé.
Lectures complémentaires :
- Comment le search_path influence-t-il la résolution de l'identifiant et le "schéma actuel"
- Tronquer toutes les tables d'une base de données Postgres
- Fonction Order By/Limit in table paramétrée par PostgreSQL
Pour les versions Postgres antérieures à 9.1 ou les variantes antérieures de la fonction utilisant regproc
et pg_get_function_identity_arguments(oid)
vérifiez l'historique des modifications de cette réponse.