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

DROP FUNCTION sans connaître le nombre/type de paramètres ?

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.