Podstawowe zapytanie
To zapytanie tworzy wszystkie niezbędne instrukcje 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
Wyjście:
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);
Wykonaj polecenia po sprawdzeniu poprawności.
Przekaż nazwę funkcji z uwzględnieniem wielkości liter i bez dodawania podwójnych cudzysłowów do dopasowania do pg_proc.proname
.
Rzutowanie na identyfikator obiektu typu regprocedure
(oid::regprocedure
), a następnie do text
niejawnie, tworzy nazwy funkcji z typami argumentów, automatycznie w cudzysłowie i kwalifikowane według schematu zgodnie z bieżącą search_path
w razie potrzeby. Brak wstrzykiwania SQL możliwe.
pg_function_is_visible(oid)
ogranicza wybór do funkcji w bieżącej search_path
("widoczny"). Możesz tego chcieć lub nie.
Jeśli masz wiele funkcji o tej samej nazwie w wielu schematach lub funkcje przeciążone różnymi argumentami funkcji, wszystkie z nich zostaną wymienione osobno. Możesz chcieć ograniczyć się do określonych schematów lub określonych parametrów funkcji.
Powiązane:
- Kiedy/jak są powiązane funkcje wyrażeń wartości domyślnej w odniesieniu do ścieżki_wyszukiwania?
Funkcja
Możesz zbudować plpgsql
funkcja wokół tego, aby natychmiast wykonać instrukcje za pomocą EXECUTE
. Dla Postgresa 9.1 lub później:Uważaj! Porzuca twoje funkcje!
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$;
Zadzwoń:
SELECT f_delfunc('my_function_name');
Funkcja zwraca liczbę znalezionych i usuniętych funkcji, jeśli nie zgłoszono żadnych wyjątków. 0
jeśli nie znaleziono żadnego.
Dalsza lektura:
- W jaki sposób search_path wpływa na rozpoznawanie identyfikatora i „bieżący schemat”
- Obcinanie wszystkich tabel w bazie danych Postgres
- Sparametryzowana PostgreSQL funkcja Order By / Limit w tabeli
Dla wersji Postgres starszych niż 9.1 lub starszych wariantów funkcji przy użyciu regproc
i pg_get_function_identity_arguments(oid)
sprawdź historię edycji tej odpowiedzi.