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;
da este error:Al cambiar el tipo de una columna utilizada en otras vistas
cannot alter type of a column used by a view or rule
DETAIL: rule _RETURN on view v1 depends on column "name"
Esta es una especie de molesto, porque ahora tengo que volver a crear todos los puntos de vista que hacen referencia a la columna de la base.name
. Es especialmente molesto cuando tengo vistas que hacen referencia a otras vistas.
Lo que me gustaría ser capaz de hacer es algo como:
select recreate_views('v1', 'v2', 'alter table base alter column name type text');
y tienen la función de obtener las definiciones de vista de v1 y v2, soltarlos, ejecute el código especificado, a continuación, volver a crear v1 y v2. Si pudiera usar Ruby, probablemente tendría la función de tomar una función/bloque/lambda, como
recreate_views 'v1', 'v2' do
alter table base alter column name type text
end
es algo como esto posible? ¿Hay utilidades que hagan algo similar?
'selecto definición de pg_views donde nombredevista = 'v1'; 'le da la definición de vista – dbenhur