it-swarm.com.de

PostgreSQL: Auflisten aller gespeicherten Funktionen, die auf eine bestimmte Tabelle zugreifen

Einleitung :

PostgreSQL-Datenbank mit mehreren hundert gespeicherten Funktionen, einschließlich veralteter, nicht verwendeter usw.

Problem

Ich muss alle gespeicherten Funktionen herausfinden, die eine Beziehung zur Tabelle X haben - da ich die Tabellenstruktur ändern möchte. Einige von ihnen werden möglicherweise nicht verwendet, daher kann ich das nicht einfach durch Durchsuchen des Codes tun.

Die Lösung, die ich am Geldautomaten habe, ist das Ausführen von psqls \df+ und Grepping-Ausgabe, aber ich würde eine datenbankähnlichere Lösung bevorzugen, d. h. unter Verwendung eines Informationsschemas. Dies wird definitiv eine sich wiederholende Aufgabe sein und ich würde es gerne schön und sauber haben.

Irgendwelche Vorschläge?

13

Der Hauptteil einer Funktion wird nur als string gespeichert. Es gibt keine Liste der referenzierten Objekte. (Dies unterscheidet sich beispielsweise von Ansichten, in denen tatsächliche Links zu referenzierten Tabellen gespeichert werden.)

Diese Abfrage für Postgres 10 oder älter verwendet die Funktion Systemkataloginformationsfunktion pg_get_functiondef() , um die CREATE FUNCTION Skript für relevante Funktionen und Suche nach dem Tabellennamen mit einem regulären Ausdruck ohne Berücksichtigung der Groß- und Kleinschreibung:

SELECT n.nspname AS schema_name
     , p.proname AS function_name
     , pg_get_function_arguments(p.oid) AS args
     , pg_get_functiondef(p.oid) AS func_def
FROM   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  NOT p.proisagg
AND    n.nspname NOT LIKE 'pg_%'
AND    n.nspname <> 'information_schema'
AND    pg_get_functiondef(p.oid) ~* '\mbig\M';

Es sollte den Job machen, aber es ist offensichtlich nicht kugelsicher. Es kann für dynamisches SQL fehlschlagen, bei dem der Tabellenname dynamisch generiert wird, und es kann eine beliebige Anzahl von Fehlalarmen zurückgeben - insbesondere, wenn der Tabellenname ein allgemeines Wort ist.

Aggregierte Funktionen und alle Funktionen aus Systemschemata sind ausgeschlossen.

\m und \M Markieren Sie den Anfang und das Ende eines Wortes im regulären Ausdruck.

Der Systemkatalog pg_proc geändert in Postgres 11. proisagg wurde durch prokind ersetzt, echte gespeicherte Prozeduren wurden hinzugefügt. Sie müssen sich anpassen. Verbunden:

18

Diese Abfrage ist ziemlich einfach zu bedienen:

SELECT proname, proargnames, prosrc FROM pg_proc WHERE prosrc ILIKE '%Text to search%';