PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

DROP-FUNKTION, ohne die Anzahl/Art der Parameter zu kennen?

Grundlegende Abfrage

Diese Abfrage erstellt alle erforderlichen DDL-Anweisungen:

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

Ausgabe:

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);

Führen Sie die Befehle nach Plausibilitätsprüfung aus.

Übergeben Sie den Funktionsnamen unter Berücksichtigung der Groß- und Kleinschreibung und ohne hinzugefügte doppelte Anführungszeichen mit pg_proc.proname abzugleichen .

Die Umwandlung in den Objektbezeichnertyp regprocedure (oid::regprocedure ) und dann zu text erzeugt implizit Funktionsnamen mit Argumenttypen, automatisch in doppelte Anführungszeichen gesetzt und gemäß dem aktuellen search_path schemaqualifiziert wo benötigt. Keine SQL-Injection möglich.

pg_function_is_visible(oid) schränkt die Auswahl auf Funktionen im aktuellen search_path ein ("sichtbar"). Sie können dies wollen oder nicht.

Wenn Sie mehrere Funktionen mit demselben Namen in mehreren Schemas oder überladene Funktionen mit verschiedenen Funktionsargumenten haben, all davon werden separat aufgeführt. Möglicherweise möchten Sie auf bestimmte Schema(s) oder bestimmte Funktionsparameter beschränken.

Verwandte:

  • Wann / wie werden Standardwert-Ausdrucksfunktionen in Bezug auf Suchpfad gebunden?

Funktion

Sie können ein plpgsql erstellen um dies zu umgehen, um die Anweisungen sofort mit EXECUTE auszuführen . Für Postgres 9.1 oder später:Achtung! Es lässt Ihre Funktionen fallen!

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$;

Aufruf:

SELECT f_delfunc('my_function_name');

Die Funktion gibt die Anzahl der gefundenen und gelöschten Funktionen zurück, wenn keine Ausnahmen ausgelöst werden. 0 wenn keine gefunden wurden.

Weiterführende Literatur:

  • Wie beeinflusst der Suchpfad die Identifikatorauflösung und das "aktuelle Schema"
  • Abschneiden aller Tabellen in einer Postgres-Datenbank
  • PostgreSQL parametrisierte Order By / Limit in Tabellenfunktion

Für Postgres-Versionen älter als 9.1 oder ältere Varianten der Funktion mit regproc und pg_get_function_identity_arguments(oid) Überprüfen Sie den Bearbeitungsverlauf dieser Antwort.