Поиск зависимых объектов в 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;

Комментарии

Оставить комментарий

Ответ на Поиск зависимых объектов в PostgreSQL