Základní dotaz
Tento dotaz vytvoří všechny potřebné příkazy DDL:
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
Výstup:
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);
Proveďte příkazy po kontrole věrohodnosti.
Předejte název funkce rozlišují se malá a velká písmena a bez přidaných dvojitých uvozovek k porovnání s pg_proc.proname
.
Přetypování na typ identifikátoru objektu regprocedure
(oid::regprocedure
) a poté na text
implicitně vytváří názvy funkcí s typy argumentů, automaticky v dvojitých uvozovkách a kvalifikovaných podle schématu podle aktuální search_path
kde je potřeba. Žádné vkládání SQL možné.
pg_function_is_visible(oid)
omezuje výběr na funkce v aktuální search_path
("viditelné"). To můžete nebo nemusíte chtít.
Pokud máte více funkcí se stejným názvem ve více schématech nebo přetížené funkce s různými argumenty funkcí, vše z nich budou uvedeny samostatně. Možná budete chtít omezit na konkrétní schéma(a) nebo konkrétní funkční parametr(y).
Související:
- Kdy / jak jsou funkce výrazu výchozí hodnoty svázány s ohledem na vyhledávací_cestu?
Funkce
Můžete vytvořit plpgsql
funkce kolem tohoto pro okamžité provedení příkazů pomocí EXECUTE
. Pro Postgres 9.1 nebo později:Pozor! Ztratí vaše funkce!
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$;
Volejte:
SELECT f_delfunc('my_function_name');
Funkce vrátí počet nalezených a zrušených funkcí, pokud nejsou vyvolány žádné výjimky. 0
pokud nebyly žádné nalezeny.
Další čtení:
- Jak parametr search_path ovlivňuje rozlišení identifikátoru a "aktuální schéma"
- Zkrácení všech tabulek v databázi Postgres
- PostgreSQL parametrizované Order By / Limit v tabulkové funkci
Pro verze Postgres starší než 9.1 nebo starší varianty funkce pomocí regproc
a pg_get_function_identity_arguments(oid)
zkontrolujte historii úprav této odpovědi.