Поиск зависимых объектов в PostgreSQL
Бывает нужно изменить тип колонки таблицы или изменить представление (view). Делаешь запрос типа
ALTER TABLE 'table1' ALTER COLUMN 'col1' TYPE 'type1';
и получаешь ошибку
ERROR: cannot alter type of a column used by a view or rule
Постгрес не может изменить тип колонки, т.к. колонка используется представлением или правилом.
Чтобы успешно выполнить изменение типа колонки, нужно сначала удалить все зависимые объекты, а после изменения типа пересоздать удаленные объекты.
Но как найти зависимые объекты?
Для этого нужно использовать следующий запрос:
SELECT
distinct r.ev_class::regclass
FROM
pg_attribute as a
join pg_depend as d on d.refobjid = a.attrelid AND d.refobjsubid = a.attnum
join pg_rewrite as r ON d.objid = r.oid
WHERE
a.attrelid = 'table_name'::regclass
AND a.attname = 'column_name';
В этом запросе table_name – название таблицы, а column_name – название колонки для которой нужно найти зависимые сущности.
Если найти нужно таблицу или представление, запрос упрощается:
SELECT
distinct r.ev_class::regclass
FROM
pg_attribute as a
join pg_depend as d on d.refobjid = a.attrelid AND d.refobjsubid = a.attnum
join pg_rewrite as r ON d.objid = r.oid
WHERE
a.attrelid = 'table_name'::regclass;