Grundläggande fråga
Den här frågan skapar alla nödvändiga DDL-satser:
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
Utdata:
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);
Utför kommandona efter att ha kontrollerat rimligheten.
Skicka funktionsnamnet skiftlägeskänsligt och utan tillagda dubbla citattecken att matcha mot pg_proc.proname
.
Cast till objektidentifieraren typ regprocedure
(oid::regprocedure
), och sedan till text
producerar implicit funktionsnamn med argumenttyper, automatiskt dubbla citattecken och schemakvalificerade enligt den nuvarande search_path
där det behövs. Ingen SQL-injektion möjligt.
pg_function_is_visible(oid)
begränsar valet till funktioner i den aktuella search_path
("synlig"). Du kanske vill ha detta eller inte.
Om du har flera funktioner med samma namn i flera scheman, eller överbelastade funktioner med olika funktionsargument, alla av dessa kommer att listas separat. Du kanske vill begränsa till specifika schema(n) eller specifika funktionsparametrar.
Relaterat:
- När/hur är funktioner för standardvärdeuttryck bundna med avseende på sökväg?
Funktion
Du kan bygga en plpgsql
funktion kring detta för att exekvera satserna omedelbart med EXECUTE
. För Postgres 9.1 eller senare:Försiktigt! Det tar bort dina 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:
SELECT f_delfunc('my_function_name');
Funktionen returnerar antalet funktioner som hittats och tappats om inga undantag höjs. 0
om ingen hittades.
Mer läsning:
- Hur påverkar sökvägen identifierarens upplösning och det "aktuella schemat"
- Trunkerar alla tabeller i en Postgres-databas
- PostgreSQL-parameteriserad Ordning efter / Limit i tabellfunktion
För Postgres-versioner äldre än 9.1 eller äldre varianter av funktionen som använder regproc
och pg_get_function_identity_arguments(oid)
kontrollera redigeringshistoriken för det här svaret.