Рефакторинг PostgreSQL SProcs
-
21-08-2019 - |
Вопрос
при умеренной установке PostgreSQL мы накопили довольно много хранимых процедур/функций и типов.
Теперь в составном типе самого низкого уровня (т.е.С его помощью создаются 3 типа, и множество функций ссылаются на любой из этих типов). Неправильный тип (т.е.smallint вместо bigint), таким образом, обработка его идентична, отличается только диапазон.
- Как я узнаю все типы в зависимости от типа (pg_catalog.pg_type кажется недостаточным)?
- Как я могу узнать все функции в зависимости от типа (в качестве аргументов и локально озеленных VAR)?
- Могу ли я реформировать композитный тип (возможно, изменить Smallint на Bigint), не сбрасывая/восстанавливая каждую функцию в зависимости от этого?
- Есть ли какой -либо вид автоматизации/инструмента/лучшей практики для такого рефакторинга?
Я знаю, что это 4 вопроса в одном, но это немного расстраивает, и любая помощь будет оценена по достоинству!Большое спасибо!
Решение
Системный каталог «pg_dependent» содержит полезную информацию о зависимостях.Вы можете найти объекты в зависимости от определенных типов примерно так:
select * from pg_depend where refclassid = 'pg_type'::regclass
and refobjid = 'information_schema.sql_identifier'::regtype;
Это находит объекты, зависящие от типа «информационная_схема.sql_identifier».В результате classid — это OID каталога. Например, для столбца, зависящего от типа пользователя, classid — это «pg_class»::regclass, objid — это OID строки pg_class, а objsubid — это значение attnum из pg_attribute. , поэтому в этом случае вы можете отформатировать результаты следующим образом:
select objid::regclass, attname from pg_depend
join pg_attribute on pg_attribute.attrelid = pg_depend.objid and pg_attribute.attnum = pg_depend.objsubid
where refclassid = 'pg_type'::regclass and refobjid = 'information_schema.sql_identifier'::regtype
and classid = 'pg_class'::regclass
limit 10
Итак, в pg_dependent (classid,objid,objsubid)
описать некоторый объект, который зависит от объекта, описываемого (refclassid,refobjid)
.