sql >> Databáze >  >> RDS >> PostgreSQL

3 způsoby, jak vypsat všechny uložené procedury, které odkazují na tabulku v PostgreSQL

Zde jsou tři příklady vrácení seznamu uložených procedur, které odkazují na konkrétní tabulku v PostgreSQL.

information_schema.routines Zobrazit

Můžeme se dotazovat na information_schema.routines podívejte se, zda některá z definic obsahuje název tabulky.

Příklad:

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

V tomto příkladu jsem zkontroloval, zda některá z uložených procedur nemá text artists v jejich definici.

ILIKE operátor nerozlišuje malá a velká písmena podle aktivního národního prostředí. Toto je rozšíření PostgreSQL a není součástí standardu SQL. Chcete-li rozlišovat malá a velká písmena, použijte ILIKE .

Všimněte si, že to není dokonalé v tom smyslu, že by to mohlo vrátit falešně pozitivní, pokud je text v proceduře, ale není to tabulka. Chcete-li toto riziko zmírnit, možná byste mohli upřesnit kritéria filtru.

pg_proc Katalog

pg_catalog.pg_proc katalog ukládá informace o funkcích, procedurách, agregačních funkcích a funkcích oken. Můžeme se tedy dotazovat takto:

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

V tomto případě se ke katalogu připojíme pomocí pg_catalog.pg_namespace katalogu filtrovat výsledky pouze na procedury s public jmenný prostor.

Alternativně můžeme použít pg_get_functiondef() funkce pro získání definice. Tato funkce ve skutečnosti rekonstruuje příkaz k vytvoření uložené procedury. Je to dekompilovaná rekonstrukce, nikoli původní text příkazu. Výsledkem je CREATE OR REPLACE PROCEDURE příkaz pro uloženou proceduru.

Příklad:

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

Získat konkrétní řádek, který odkazuje na tabulku

Náš dotaz můžeme upravit tak, aby obsahoval číslo řádku, který odkazuje na tabulku:

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

Tento příklad je založen na odpovědi Stack Overflow od Klin.


  1. Aktualizace databázových řádků bez zamykání tabulky v PostgreSQL 9.2

  2. Jak pomocí psql zobrazím seznam rozšíření nainstalovaných v databázi?

  3. Jak MID() funguje v MariaDB

  4. Nejlepší nástroje s otevřeným zdrojovým kódem pro migrace PostgreSQL