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

3 Möglichkeiten zum Auflisten aller gespeicherten Prozeduren, die auf eine Tabelle in PostgreSQL verweisen

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.