sql >> Database teknologi >  >> RDS >> PostgreSQL

3 måder at liste alle lagrede procedurer, der refererer til en tabel i PostgreSQL

Her er tre eksempler på returnering af en liste over lagrede procedurer, der refererer til en specifik tabel i PostgreSQL.

information_schema.routines Vis

Vi kan forespørge på information_schema.routines se, om nogen af ​​definitionerne indeholder tabelnavnet.

Eksempel:

SELECT
    routine_name,
    routine_body,
    routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%'; 

I dette eksempel tjekkede jeg for at se, om nogen af ​​de lagrede procedurer havde teksten artists i deres definition.

ILIKE operatoren gør matchet uafhængigt af store og små bogstaver i henhold til den aktive lokalitet. Dette er en PostgreSQL-udvidelse, og den er ikke en del af SQL-standarden. Brug LIKE for et match, der skelner mellem store og små bogstaver .

Bemærk, at det ikke er perfekt i den forstand, at det kan returnere falske positiver, hvis teksten er i proceduren, men det er ikke en tabel. For at mindske denne risiko kan du måske justere filterkriterierne.

pg_proc Katalog

pg_catalog.pg_proc kataloget gemmer oplysninger om funktioner, procedurer, aggregerede funktioner og vinduesfunktioner. Vi kan derfor spørge sådan her:

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

I dette tilfælde forbinder vi kataloget med pg_catalog.pg_namespace katalog for at filtrere resultaterne til kun procedurer med public navneområde.

Vi kan alternativt bruge pg_get_functiondef() funktion for at få definitionen. Denne funktion rekonstruerer faktisk oprettelseskommandoen for den lagrede procedure. Det er en dekompileret rekonstruktion, ikke den originale tekst til kommandoen. Dette resulterer i en CREATE OR REPLACE PROCEDURE erklæring for den lagrede procedure.

Eksempel:

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

Hent den specifikke linje, der refererer til tabellen

Vi kan ændre vores forespørgsel til at inkludere linjenummeret, der refererer til tabellen:

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

Dette eksempel er baseret på et Stack Overflow-svar af Klin.


  1. Langsomhed fundet, når base 64-billede vælger og koder fra databasen

  2. 3 måder at sikkerhedskopiere en SQLite-database på

  3. Tæller antallet af forekomster af et tegn i Oracle SQL

  4. Hvordan importerer jeg en SQL-fil ved hjælp af kommandolinjen i MySQL?