sql >> Databasteknik >  >> RDS >> PostgreSQL

3 sätt att lista alla lagrade procedurer som refererar till en tabell i PostgreSQL

Här är tre exempel på att returnera en lista med lagrade procedurer som refererar till en specifik tabell i PostgreSQL.

information_schema.routines Visa

Vi kan fråga information_schema.routines visa för att se om någon av definitionerna innehåller tabellnamnet.

Exempel:

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 det här exemplet kontrollerade jag om någon av de lagrade procedurerna hade texten artists i deras definition.

ILIKE operatorn gör matchningen skiftlägesokänslig enligt den aktiva lokalen. Detta är en PostgreSQL-tillägg, och den är inte en del av SQL-standarden. För en skiftlägeskänslig matchning, använd LIKE .

Observera att det inte är perfekt, i den meningen att det kan returnera falska positiva resultat om texten finns i proceduren, men det är inte en tabell. För att minska denna risk kan du kanske förfina filterkriterierna.

pg_proc Katalog

pg_catalog.pg_proc katalogen lagrar information om funktioner, procedurer, aggregerade funktioner och fönsterfunktioner. Vi kan därför fråga så här:

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 det här fallet sammanfogar vi katalogen med pg_catalog.pg_namespace katalog för att filtrera resultaten till endast procedurer med public namnutrymme.

Vi kan alternativt använda pg_get_functiondef() funktion för att få definitionen. Denna funktion rekonstruerar faktiskt skapande kommandot för den lagrade proceduren. Det är en dekompilerad rekonstruktion, inte den ursprungliga texten till kommandot. Detta resulterar i en CREATE OR REPLACE PROCEDURE uttalande för den lagrade proceduren.

Exempel:

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

Hämta den specifika raden som refererar till tabellen

Vi kan ändra vår fråga så att den inkluderar radnumret som refererar till 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%';

Detta exempel är baserat på ett Stack Overflow-svar av Klin.


  1. Skapa en tabellvärderad funktion i SQL Server

  2. Hur stor inverkan kan ett val av datatyp ha?

  3. Automatisera Barman med Puppet:it2ndq/barman (del ett)

  4. Grundläggande tabelluttryck, del 9 – vyer, jämfört med härledda tabeller och CTE