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.