Grundlæggende forespørgsel
Denne forespørgsel opretter alle nødvendige DDL-sætninger:
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
Output:
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);
Udfør kommandoerne efter at have kontrolleret plausibiliteten.
Send funktionsnavnet skifter mellem store og små bogstaver og uden tilføjede dobbelte anførselstegn at matche mod pg_proc.proname
.
Castet til objektidentifikatortypen regprocedure
(oid::regprocedure
), og derefter til text
producerer implicit funktionsnavne med argumenttyper, automatisk dobbeltciteret og skema-kvalificeret i henhold til den aktuelle search_path
hvor det er nødvendigt. Ingen SQL-injektion muligt.
pg_function_is_visible(oid)
begrænser valget til funktioner i den aktuelle search_path
("synlig"). Du ønsker måske eller ikke ønsker dette.
Hvis du har flere funktioner af samme navn i flere skemaer eller overbelastede funktioner med forskellige funktionsargumenter, alle af disse vil blive opført separat. Du ønsker måske at begrænse til specifikke skema(er) eller specifikke funktionsparametre.
Relateret:
- Hvornår/hvordan er standardværdiudtryksfunktioner bundet med hensyn til søgesti?
Funktion
Du kan bygge en plpgsql
funktion omkring dette for at udføre sætningerne med det samme med EXECUTE
. Til Postgres 9.1 eller senere:Forsigtig! Det taber dine funktioner!
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$;
Ring til:
SELECT f_delfunc('my_function_name');
Funktionen returnerer antallet af funktioner, der er fundet og slettet, hvis der ikke er nogen undtagelser. 0
hvis ingen blev fundet.
Yderligere læsning:
- Hvordan påvirker søgestien identifikationsopløsning og det "aktuelle skema"
- Trunkering af alle tabeller i en Postgres-database
- PostgreSQL parametriseret rækkefølge efter / grænse i tabelfunktion
For Postgres-versioner ældre end 9.1 eller ældre varianter af funktionen ved hjælp af regproc
og pg_get_function_identity_arguments(oid)
tjek redigeringshistorikken for dette svar.