Тело функции просто хранится в виде строки . Нет списка объектов, на которые есть ссылки. (Это отличается от представлений, например, где сохраняются фактические ссылки на ссылочные таблицы.)
Этот запрос для Postgres 10 или более ранней версии использует информационную функцию системного каталога,pg_get_functiondef()
чтобы восстановить CREATE FUNCTION
сценарий для соответствующих функций и ищет имя таблицы с регулярным выражением без учета регистра:
SELECT n.nspname AS schema_name
, p.proname AS function_name
, pg_get_function_arguments(p.oid) AS args
, pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
AND pg_get_functiondef(p.oid) ~* '\mbig\M';
Это должно сделать работу, но это явно не пуленепробиваемый. Может произойти сбой для динамического SQL, где имя таблицы генерируется динамически, и может возвращать любое количество ложных срабатываний, особенно если имя таблицы является общим словом.
Агрегатные функции и все функции из системных схем исключаются.
\m
и\M
отметьте начало и конец слова в регулярном выражении.
Системный каталог pg_proc
изменен в Postgres 11. proisagg
был заменен, добавлены prokind
истинные хранимые процедуры. Вам нужно адаптироваться. Связанные с:
EXECUTE
такие выражения, как'mm_'||name_parameter
, и он не будет корректно работать с именами в кавычках, такими как"my""table""
или со сложением регистра, но он будет делать большую часть того, что захочет большинство людей ,