Рефакторинг PostgreSQL SProcs - PullRequest
0 голосов
/ 11 мая 2009

при умеренной установке PostgreSQL мы накопили немало хранимых процедур / функций и типов.

Теперь в составном типе самого низкого уровня (т. Е. С его помощью построено 3 типа и множество функций ссылаются на любой из этих типов) один элемент типа имеет неправильный тип (т.е. smallint вместо bigint) Таким образом, обращение с ним идентично, отличается только диапазон.

  1. Откуда я знаю все типы в зависимости от тип (кажется, pg_catalog.pg_type недостаточная)
  2. Как я могу знать все функции в зависимости от типа (как аргументы и локальные переменные)?
  3. Можно ли выполнить рефакторинг составного типа? (возможно сменить smallint на bigint) без падения / восстановления каждого одна функция в зависимости от этого?
  4. Есть ли автоматизация / инструмент / лучшие практики для такой рефакторинг?

Я знаю, что это 4 вопроса в одном, но это немного расстраивает, и любая помощь будет признательна! Большое спасибо!

1 Ответ

1 голос
/ 12 мая 2009

Системный каталог "pg_depend" содержит некоторую полезную информацию о зависимостях. Вы можете найти объекты в зависимости от определенных типов, например, так:

select * from pg_depend where refclassid = 'pg_type'::regclass
    and refobjid = 'information_schema.sql_identifier'::regtype;

Находит объекты, зависящие от типа "information_schema.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_depend, (classid,objid,objsubid) опишите некоторый объект, который зависит от объекта, описанного (refclassid,refobjid).

...