create table base (name character varying(255));
create view v1 as select *, now() from base;
create view v2 as select * from v1 where name = 'joe';
alter table base alter column name type text;
Выдает эту ошибку:
cannot alter type of a column used by a view or rule
DETAIL: rule _RETURN on view v1 depends on column "name"
Это немного раздражает, потому что теперь мне нужно воссоздать все представления, которые ссылаются на столбец base.name
. Это особенно раздражает, когда у меня есть представления, которые ссылаются на другие представления.
Я хотел бы иметь возможность сделать что-то вроде:
select recreate_views('v1', 'v2', 'alter table base alter column name type text');
И сделать так, чтобы функция получала определения представлений для v1 и v2, удаляла их, запускала указанный код, а затем воссоздавала v1 и v2. Если бы я мог использовать Ruby, я бы, вероятно, использовал функцию/блок/лямбду, например
recreate_views 'v1', 'v2' do
alter table base alter column name type text
end
Возможно ли что-то подобное? Существуют ли утилиты, которые делают что-то подобное?