Kann ich Funktionen mit einem Platzhalter löschen, unabhängig von Parametern?
Einführung
Wartung In einer Textdatei gespeicherte Funktionen können umständlich sein, insbesondere beim Hinzufügen oder Entfernen von Parametern. Das manuelle Eingeben der genauen Parameterreihenfolge für jede Funktion kann mühsam sein. In diesem Artikel wird eine Lösung zum Löschen aller Funktionen mit einem bestimmten Namen mithilfe eines Platzhalters untersucht, sodass keine Parameter angegeben werden müssen.
Abfrage zum Löschen von Funktionen
Um das Notwendige zu erstellen Führen Sie bei DDL-Anweisungen die folgende Abfrage aus:
SELECT 'DROP FUNCTION ' || oid::regprocedure FROM pg_proc WHERE proname = 'my_function_name' -- Replace 'my_function_name' with the target function name AND pg_function_is_visible(oid); -- Restrict to the current search path
Die Abfrage erzeugt DROP FUNCTION-Anweisungen mit Argumenttypen, doppelten Anführungszeichen und Schema-qualifiziert. Dies gewährleistet keine SQL-Injection-Schwachstelle und entspricht dem aktuellen Suchpfad.
Funktion zum Ausführen von Drop-Anweisungen
Für die sofortige Ausführung der DROP-Anweisungen erstellen Sie eine PL/pgSQL-Funktion :
CREATE OR REPLACE FUNCTION f_delfunc(_name text, OUT functions_dropped int) LANGUAGE plpgsql AS $func$ 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) INTO functions_dropped, _sql; IF functions_dropped > 0 THEN EXECUTE _sql; END IF; END $func$;
Rufen Sie die Funktion mit dem gewünschten Funktionsnamen auf, um die passenden Funktionen zu löschen und die Nummer zurückzugeben gelöscht:
SELECT f_delfunc('my_function_name');
Zusätzliche Überlegungen
Das obige ist der detaillierte Inhalt vonKann ich alle Funktionen, die einem Platzhalternamen entsprechen, in PostgreSQL löschen, unabhängig von ihren Parametern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!