PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

3 sposoby na wyświetlenie listy wszystkich procedur składowanych, które odwołują się do tabeli w PostgreSQL

Oto trzy przykłady zwracania listy procedur składowanych, które odwołują się do określonej tabeli w PostgreSQL.

information_schema.routines Zobacz

Możemy wysłać zapytanie do information_schema.routines zobacz, czy któraś z definicji zawiera nazwę tabeli.

Przykład:

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

W tym przykładzie sprawdziłem, czy któraś z procedur składowanych zawiera tekst artists w ich definicji.

ILIKE Operator sprawia, że ​​dopasowanie nie uwzględnia wielkości liter zgodnie z aktywnymi ustawieniami narodowymi. To jest rozszerzenie PostgreSQL i nie jest częścią standardu SQL. Aby dopasować wielkość liter, użyj LIKE .

Zauważ, że nie jest idealny, w tym sensie, że może zwrócić fałszywe alarmy, jeśli tekst znajduje się w procedurze, ale nie jest to tabela. Aby złagodzić to ryzyko, być może możesz doprecyzować kryteria filtrowania.

pg_proc Katalog

pg_catalog.pg_proc Katalog przechowuje informacje o funkcjach, procedurach, funkcjach agregujących i funkcjach okna. Możemy zatem zapytać w ten sposób:

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

W tym przypadku łączymy katalog z pg_catalog.pg_namespace katalog, aby filtrować wyniki tylko do procedur z public przestrzeń nazw.

Możemy alternatywnie użyć pg_get_functiondef() funkcja, aby uzyskać definicję. Ta funkcja faktycznie rekonstruuje polecenie tworzenia dla procedury składowanej. To dekompilowana rekonstrukcja, a nie oryginalny tekst polecenia. Powoduje to CREATE OR REPLACE PROCEDURE instrukcja dla procedury składowanej.

Przykład:

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

Pobierz określony wiersz, który odwołuje się do tabeli

Możemy zmodyfikować nasze zapytanie, aby zawierało numer wiersza, który odwołuje się do tabeli:

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

Ten przykład jest oparty na odpowiedzi Klina na przepełnienie stosu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwania związane ze skalowaniem bazy danych Moodle PostgreSQL

  2. PostgreSQL jak połączyć wartość interwału '2 dni'

  3. Czy usunięcie bazy danych nie musi odbywać się w żadnej transakcji?

  4. pg_ctl Wskazówki i porady

  5. PostgreSQL, przeciągnij i zamień