sql >> Database >  >> RDS >> PostgreSQL

3 manieren om alle opgeslagen procedures weer te geven die verwijzen naar een tabel in PostgreSQL

Hier zijn drie voorbeelden van het retourneren van een lijst met opgeslagen procedures die verwijzen naar een specifieke tabel in PostgreSQL.

De information_schema.routines Bekijk

We kunnen de information_schema.routines . opvragen bekijken om te zien of een van de definities de tabelnaam bevat.

Voorbeeld:

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 dit voorbeeld heb ik gecontroleerd of een van de opgeslagen procedures de tekst artists . had in hun definitie.

De ILIKE operator maakt de overeenkomst hoofdletterongevoelig volgens de actieve landinstelling. Dit is een PostgreSQL-extensie en maakt geen deel uit van de SQL-standaard. Gebruik voor een hoofdlettergevoelige overeenkomst LIKE .

Merk op dat het niet perfect is, in die zin dat het valse positieven kan retourneren als de tekst in de procedure staat, maar het is geen tabel. Om dit risico te verkleinen, kunt u misschien de filtercriteria verfijnen.

De pg_proc Catalogus

De pg_catalog.pg_proc catalogus slaat informatie op over functies, procedures, aggregatiefuncties en vensterfuncties. We kunnen daarom vragen als volgt:

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 dit geval voegen we ons bij de catalogus met de pg_catalog.pg_namespace catalogus om de resultaten te filteren naar alleen procedures met de public naamruimte.

We kunnen ook de pg_get_functiondef() . gebruiken functie om de definitie te krijgen. Deze functie reconstrueert in feite de opdracht voor het maken van de opgeslagen procedure. Het is een gedecompileerde reconstructie, niet de originele tekst van de opdracht. Dit resulteert in een CREATE OR REPLACE PROCEDURE verklaring voor de opgeslagen procedure.

Voorbeeld:

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%';

De specifieke regel ophalen die naar de tabel verwijst

We kunnen onze query aanpassen om het regelnummer op te nemen dat naar de tabel verwijst:

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%';

Dit voorbeeld is gebaseerd op een Stack Overflow-antwoord van Klin.


  1. 4 functies om het uur uit een tijdwaarde te halen in MariaDB

  2. De module-API's in Java verkennen

  3. PASS Summit bijwonen in Charlotte?

  4. MySQL INT betekenis