Hier sind drei Beispiele für die Rückgabe einer Liste gespeicherter Prozeduren, die auf eine bestimmte Tabelle in PostgreSQL verweisen.
Die information_schema.routines
Anzeigen
Wir können die information_schema.routines
abfragen Ansicht, um zu sehen, ob eine der Definitionen den Tabellennamen enthält.
Beispiel:
SELECT
routine_name,
routine_body,
routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';
In diesem Beispiel habe ich überprüft, ob eine der gespeicherten Prozeduren den Text artists
enthält in ihrer Definition.
Der ILIKE
-Operator macht die Übereinstimmung entsprechend dem aktiven Gebietsschema unabhängig von Groß- und Kleinschreibung. Dies ist eine PostgreSQL-Erweiterung und nicht Teil des SQL-Standards. Verwenden Sie für eine Übereinstimmung zwischen Groß- und Kleinschreibung LIKE
.
Beachten Sie, dass es nicht perfekt ist, in dem Sinne, dass es falsch positive Ergebnisse zurückgeben könnte, wenn der Text in der Prozedur enthalten ist, es sich aber nicht um eine Tabelle handelt. Um dieses Risiko zu mindern, könnten Sie vielleicht die Filterkriterien verfeinern.
Der pg_proc
Katalog
Die pg_catalog.pg_proc
Katalog speichert Informationen über Funktionen, Prozeduren, Aggregatfunktionen und Fensterfunktionen. Wir können daher wie folgt abfragen:
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
p.prosrc AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';
In diesem Fall verbinden wir den Katalog mit dem pg_catalog.pg_namespace
catalog, um die Ergebnisse nur nach Prozeduren mit dem public
zu filtern Namensraum.
Alternativ können wir auch pg_get_functiondef()
verwenden Funktion, um die Definition zu erhalten. Diese Funktion rekonstruiert tatsächlich den Erstellungsbefehl für die gespeicherte Prozedur. Es ist eine dekompilierte Rekonstruktion, nicht der ursprüngliche Text des Befehls. Dies führt zu einem CREATE OR REPLACE PROCEDURE
-Anweisung für die gespeicherte Prozedur.
Beispiel:
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
pg_get_functiondef(p.oid) AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';
Hole die spezifische Zeile, die auf die Tabelle verweist
Wir können unsere Abfrage so ändern, dass sie die Zeilennummer enthält, die auf die Tabelle verweist:
SELECT *
FROM (
SELECT
proname AS stored_procedure,
row_number() OVER (partition by proname) AS line_number,
textline
FROM (
SELECT
proname,
unnest(string_to_array(prosrc, chr(10))) AS textline
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE nspname = 'public'
AND prosrc ILIKE '%artists%'
) lines
) x
WHERE textline ILIKE '%artists%';
Dieses Beispiel basiert auf einer Stack Overflow-Antwort von Klin.