Basisquery
Deze query creëert alle benodigde DDL-statements:
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
Uitgang:
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);
Voer de commando's uit nadat de aannemelijkheid is gecontroleerd.
Geef de functienaam door hoofdlettergevoelig en zonder toegevoegde dubbele aanhalingstekens om te matchen met pg_proc.proname
.
De cast naar het object-ID type regprocedure
(oid::regprocedure
), en dan naar text
produceert impliciet functienamen met argumenttypes, automatisch dubbele aanhalingstekens en schema-gekwalificeerd volgens het huidige search_path
waar nodig. Geen SQL-injectie mogelijk.
pg_function_is_visible(oid)
beperkt de selectie tot functies in het huidige search_path
("zichtbaar"). Misschien wil je dit wel of niet.
Als u meerdere functies met dezelfde naam in meerdere schema's hebt, of overbelaste functies met verschillende functieargumenten, allemaal daarvan worden apart vermeld. Misschien wilt u zich beperken tot specifieke schema('s) of specifieke functieparameter(s).
Gerelateerd:
- Wanneer / hoe zijn standaardwaarde-expressiefuncties gebonden met betrekking tot zoekpad?
Functie
U kunt een plpgsql
. bouwen functie hier omheen om de instructies onmiddellijk uit te voeren met EXECUTE
. Voor Postgres 9.1 of later:Pas op! Het laat je functies vallen!
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$;
Bel:
SELECT f_delfunc('my_function_name');
De functie retourneert het aantal gevonden en verwijderde functies als er geen uitzonderingen worden gemaakt. 0
als er geen werd gevonden.
Verder lezen:
- Hoe beïnvloedt het zoekpad de resolutie van de ID en het "huidige schema"
- Alle tabellen in een Postgres-database afkappen
- PostgreSQL-geparametriseerde Order By / Limit in tabelfunctie
Voor Postgres-versies ouder dan 9.1 of oudere varianten van de functie die regproc
gebruiken en pg_get_function_identity_arguments(oid)
controleer de bewerkingsgeschiedenis van dit antwoord.