DROP FUNCTION ohne die Anzahl / Art der Parameter zu kennen?
Ich alle meine Funktionen in einer Textdatei mit 'CREATE OR REPLACE FUNCTION somefunction'
.
Also, wenn ich das hinzufügen oder ändern einige Funktionen, die ich einfach nur füttern Sie die Datei mit psql.
Nun, wenn ich das hinzufügen oder entfernen von Parametern, um eine vorhandene Funktion, erstellt es eine überladung mit dem gleichen Namen und das original löschen, die ich brauche geben Sie in allen parameter-Typen in der exakten Reihenfolge, die ist sowas von langweilig.
Ist es eine Art wildcard, die ich verwenden können, löschen Sie alle Funktionen mit einem bestimmten Namen, so kann ich nur hinzufügen DROP FUNCTION
Linien an die Spitze meiner Datei?
InformationsquelleAutor der Frage Steinthor.palsson | 2011-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine Funktion schreiben, die nahm den Namen der Funktion, und sah jede überladung mit Ihrer parameter-Typen aus
information_schema
dann gebaut und ausgeführt, eineDROP
für jeden.EDIT: Dies erwies sich als viel schwieriger, als ich dachte. Es sieht aus wie
information_schema
nicht immer die notwendigen parameter, die Informationen auf Ihrerroutines
Katalog. So müssen Sie PostgreSQL Ergänzende Tabellenpg_proc
undpg_type
:Habe ich erfolgreich getestet, die auf eine überladene Funktion. Es wurde ziemlich schnell zusammen geworfen, aber funktioniert gut als utility-Funktion. Ich würde empfehlen, mehr Tests, bevor Sie es in der Praxis, im Fall ich etwas übersehen.
InformationsquelleAutor der Antwort Paul Bellora
Grundlegende Abfrage
Diese Abfrage erstellt alle erforderlichen DDL-Anweisungen (vereinfacht mit cast zu
regprocedure
):Ausgabe:
Ausführen der Befehle (nach Plausibilitätsprüfung).
Den Namen der Funktion wird die groß-und Kleinschreibung und keine zusätzlichen doppelten Anführungszeichen, wenn bestanden, als
text
parameter match gegenpg_proc.proname
.Die Besetzung der Objekt-id-Typ
regprocedure
(oid::regprocedure
) macht alle Bezeichner sicher gegen SQL-injection (durch in böswilliger Absicht fehlerhaften Bezeichner). Bei der Umstellung auftext
der name der Funktion wird in doppelte Anführungszeichen und schema-qualifiziert nach den aktuellensearch_path
automatisch, sofern erforderlich.pg_function_is_visible(oid)
schränkt die Auswahl von Funktionen in der aktuellensearch_path
. Sie können oder können nicht wollen, dass. Mit der Bedingungpg_function_is_visible(oid)
im Ort, die Funktion wird garantiert, um sichtbar zu werden.Wenn Sie mehrere Funktionen mit dem gleichen Namen in mehreren schemas, oder überladene Funktionen mit verschiedenen Funktion Argumente, alle diese werden separat aufgeführt. Sie können einschränken möchten, zu bestimmten schema(s) - oder funktionsspezifische parameter(s), nachdem alle.
Verwandte:
- Funktion
Können Sie bauen eine
plpgsql
- Funktion, um dieses für die Ausführung der Anweisungen sofort mitEXECUTE
. Für Postgres 9.1 oder später:Vorsichtig! Es fällt Ihr Funktionen!
Nennen:
Oder einfach nur:
Diese Weise erhalten Sie nicht die Spalte Namen
func_dropped
für die Ergebnis-Spalte. Kann nicht von Bedeutung.Gibt die Funktion die Anzahl der Funktionen gefunden und gelöscht (keine Ausnahme ausgelöst) -
0
wenn keine gefunden wurden.Nimmt es eine (Standard -)
search_path
wopg_catalog
wurde nicht bewegt werden.Mehr in diese Verwandte Antworten:
Für Postgres-Versionen, die älter als 9.1 oder ältere Variante (N) der Funktion mit
regproc
undpg_get_function_identity_arguments(oid)
überprüfen Sie die edit-history von dieser Antwort.InformationsquelleAutor der Antwort Erwin Brandstetter
Verbesserung der ursprünglichen Antwort um
schema
zu berücksichtigen, dh.schema.my_function_name
,InformationsquelleAutor der Antwort Сухой27
Leicht verbesserte version des Erwin ' s Antwort. Zusätzlich unterstützt die folgenden
Code für copy/paste:
InformationsquelleAutor der Antwort Xtra Coder
Hier ist die Abfrage, die ich erstellt über @Сухой27 Lösung, generiert sql-Anweisungen für das löschen aller gespeicherten Funktionen in einem schema:
InformationsquelleAutor der Antwort Bo Guo