Der Hauptteil einer Funktion wird nur als Zeichenfolge 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 Systemkataloginformationsfunktion,pg_get_functiondef()
um das CREATE FUNCTION
Skript für relevante Funktionen zu rekonstruieren und nach dem Tabellennamen mit einem regulären Ausdruck ohne Berücksichtigung der Groß- und Kleinschreibung zu suchen:
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 gebräuchliches 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 pg_proc
in Postgres 11 geänderte Systemkatalog proisagg
wurde durch prokind
echte gespeicherte Prozeduren ersetzt. Sie müssen sich anpassen. Verbunden:
EXECUTE
Ausdrücke wie findet'mm_'||name_parameter
, und es wird nicht richtig mit zitierten Namen wie"my""table""
oder mit Groß- und Kleinschreibung umgehen , aber es wird das meiste tun, was die meisten Leute wollen .EXECUTE
sind fast unmöglich zu behandeln. Das Falten~*
von~
Groß- und Kleinschreibung kann jedoch anstelle von - oder einer anderen Musteranpassung ohne Berücksichtigung der Groß- und Kleinschreibung abgedeckt werden ."MyTable"
undMyTable
zumindest ... und ehrlich gesagt, ist das ein "gut, das ist vielleicht erlaubt, aber es ist nicht klug" -Zug.Diese Abfrage ist ziemlich einfach zu verwenden:
quelle