Список функций и триггеров, связанных с таблицей в PostgreSQL
Быстрый ответ
SELECT
proname
FROM
pg_proc p
JOIN
pg_namespace n ON p.pronamespace = n.oid
WHERE
prosrc LIKE '%имя_вашей_таблицы%'
AND n.nspname = 'public';
Чтобы отыскать функции PostgreSQL, ассоциированные с определённой таблицей, воспользуемся таблицей системного каталога pg_proc. Производим фильтрацию столбца с исходным кодом функции prosrc
, проверяя вхождение имя_вашей_таблицы
, и установим соответствующее пространство имён n.nspname
, в случае, если оно отличается от public
.
Устранение ложных срабатываний
Для предотвращения ложных срабатываний, таких как упоминание имени таблицы в комментариях, можно улучшить наш запрос:
SELECT
proname
FROM
pg_proc p
JOIN
pg_namespace n ON p.pronamespace = n.oid
WHERE
prosrc ~ ('[^a-z_]' || 'имя_вашей_таблицы' || '[^a_z_]')
AND n.nspname = 'public';
Тем временем мы будем использовать регулярные выражения, чтобы отслеживать упоминания имени таблицы, которые не составляют часть более длинных строк и избегать ситуаций, когда имя таблицы оказывается заключено между другими символами.
Рассмотрение ассоциированных объектов
В процессе поиска можно столкнуться с другими ассоциированными объектами, такими как триггеры и ограничения. Для их обнаружения следует обратиться к каталогам pg_trigger
и pg_constraint
и связать их с pg_class
, чтобы определить ассоциацию с именем таблицы.
Визуализация
Представьте таблицу как небольшую деревню (имя_вашей_таблицы
), а функции, триггеры и ограничения в качестве путей, ведущих к ней и от неё:
Таблица-Деревенька (🌟): `имя_вашей_таблицы`
Связующие пути (🛣️): Функция1, ТриггерА, Ограничение1
Чтобы обнаружить всю ассоциацию с нашей деревней, используем карту PostgreSQL:
SELECT
DISTINCT objname
FROM
pg_depend d
JOIN
pg_class c ON d.refobjid = c.oid
JOIN
pg_namespace n ON c.relnamespace = n.oid
WHERE
c.relname = 'имя_вашей_таблицы'
AND n.nspname = 'public'
AND d.deptype = 'n';
Этот запрос предоставит вам карту ваших баз данных. Открывайте для себя новые места!
Анализ деталей рутин
Познакомьтесь с помощником information_schema.routines
. С его помощью мы способны изучить названия, типы и свойства различных рутин, имеющихся во многих БД. А благодаря proargnames
в pg_proc
, мы получаем возможность управлять функциями с такой же лёгкостью, с которой они вызываются.
SELECT
proname,
proargnames
FROM
pg_proc p
JOIN
pg_namespace n ON p.pronamespace = n.oid
WHERE
prosrc LIKE '%имя_вашей_таблицы%'
AND n.nspname = 'public';
Вооружившись этими сведениями, вы сможете уверенно навигировать по лабиринтам кода и легко справитесь с удалением функций при помощи DROP FUNCTION
, если это окажется необходимым.