Тіло функції просто зберігається як рядок . Немає списку посилаються об’єктів. (Це відрізняється від представлень, наприклад, де зберігаються фактичні посилання на посилання на таблиці.)
Цей запит для 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""
або зі складанням регістру, але це зробить більшість того, що хоче більшість людей .