Ето три примера за връщане на списък със съхранени процедури, които препращат към конкретна таблица в PostgreSQL.
information_schema.routines
Преглед
Можем да потърсим information_schema.routines
преглед, за да видите дали някоя от дефинициите съдържа името на таблицата.
Пример:
SELECT
routine_name,
routine_body,
routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';
В този пример проверих дали някоя от съхранените процедури има текст artists
в тяхното определение.
ILIKE
операторът прави съвпадението нечувствително към регистъра на буквите според активния локал. Това е разширение на PostgreSQL и не е част от SQL стандарта. За съвпадение с отчитане на главни и малки букви използвайте LIKE
.
Имайте предвид, че не е перфектен, в смисъл, че може да върне фалшиви положителни резултати, ако текстът е в процедурата, но не е таблица. За да смекчите този риск, може би бихте могли да прецизирате критериите за филтриране.
pg_proc
Каталог
pg_catalog.pg_proc
каталог съхранява информация за функции, процедури, агрегатни функции и функции на прозореца. Следователно можем да правим заявка по следния начин:
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%';
В този случай ние присъединяваме каталога с pg_catalog.pg_namespace
каталог за филтриране на резултатите само до процедури с public
пространство от имена.
Като алтернатива можем да използваме pg_get_functiondef()
функция, за да получите дефиницията. Тази функция всъщност реконструира командата за създаване на съхранената процедура. Това е декомпилирана реконструкция, а не оригиналният текст на командата. Това води до CREATE OR REPLACE PROCEDURE
изявление за съхранената процедура.
Пример:
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%';
Вземете конкретния ред, който препраща към таблицата
Можем да модифицираме нашата заявка, за да включим номера на реда, който препраща към таблицата:
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%';
Този пример се базира на отговор на препълване на стека от Klin.