Список функций и триггеров, связанных с таблицей в PostgreSQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

SQL
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

Устранение ложных срабатываний

Для предотвращения ложных срабатываний, таких как упоминание имени таблицы в комментариях, можно улучшить наш запрос:

SQL
Скопировать код
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, чтобы определить ассоциацию с именем таблицы.

Визуализация

Представьте таблицу как небольшую деревню (имя_вашей_таблицы), а функции, триггеры и ограничения в качестве путей, ведущих к ней и от неё:

Markdown
Скопировать код
Таблица-Деревенька (🌟): `имя_вашей_таблицы`
Связующие пути (🛣️): Функция1, ТриггерА, Ограничение1

Чтобы обнаружить всю ассоциацию с нашей деревней, используем карту PostgreSQL:

SQL
Скопировать код
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, мы получаем возможность управлять функциями с такой же лёгкостью, с которой они вызываются.

SQL
Скопировать код
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, если это окажется необходимым.

Полезные материалы