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.