PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

FUNZIONE DROP senza conoscere il numero/tipo di parametri?

Richiesta di base

Questa query crea tutte le istruzioni DDL necessarie:

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

Uscita:

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);

Eseguire i comandi dopo aver verificato la plausibilità.

Passa il nome della funzione con distinzione tra maiuscole e minuscole e senza virgolette aggiunte da confrontare con pg_proc.proname .

Il cast al tipo di identificatore di oggetto regprocedure (oid::regprocedure ), e poi su text implicitamente, produce nomi di funzioni con tipi di argomenti, automaticamente tra virgolette doppie e qualificati secondo lo schema in base al search_path corrente dove necessario. Nessuna iniezione SQL possibile.

pg_function_is_visible(oid) limita la selezione alle funzioni nel search_path corrente ("visibile"). Potresti volerlo o meno.

Se hai più funzioni con lo stesso nome in più schemi o funzioni sovraccaricate con vari argomenti di funzione, tutte di quelli saranno elencati separatamente. Potresti voler limitare a schemi specifici o parametri di funzione specifici.

Correlati:

  • Quando/come vengono vincolate le funzioni di espressione del valore predefinito rispetto a percorso_ricerca?

Funzione

Puoi creare un plpgsql funzione attorno a questo per eseguire immediatamente le istruzioni con EXECUTE . Per Postgres 9.1 o successivo:Attenzione! Perde le tue funzioni!

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$;

Chiama:

SELECT f_delfunc('my_function_name');

La funzione restituisce il numero di funzioni trovate e eliminate se non vengono sollevate eccezioni. 0 se nessuno è stato trovato.

Ulteriori letture:

  • In che modo il percorso_ricerca influenza la risoluzione dell'identificatore e lo "schema corrente"
  • Troncare tutte le tabelle in un database Postgres
  • Funzione Ordine per / Limite nella tabella parametrizzata PostgreSQL

Per le versioni Postgres precedenti alla 9.1 o versioni precedenti della funzione utilizzando regproc e pg_get_function_identity_arguments(oid) controlla la cronologia delle modifiche di questa risposta.