Изменение типа столбца, используемого в других представлениях

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

Возможно ли что-то подобное? Существуют ли утилиты, которые делают что-то подобное?

6
задан Joe Van Dyk 14 March 2012 в 22:40
поделиться