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;
dà questo errore:Modifica del tipo di una colonna utilizzata in altre viste
cannot alter type of a column used by a view or rule
DETAIL: rule _RETURN on view v1 depends on column "name"
Questa è una sorta di fastidioso, perché ora devo ricreare tutte le viste che fanno riferimento la colonna base.name
. È particolarmente fastidioso quando ho delle opinioni che fanno riferimento ad altre visualizzazioni.
Quello che mi piacerebbe essere in grado di fare è qualcosa di simile:
select recreate_views('v1', 'v2', 'alter table base alter column name type text');
e hanno la funzione di ottenere le definizioni di visualizzazione per v1 e v2, rilasciarli, eseguire il codice specificato, quindi ricreare v1 e v2. Se potessi usare Ruby, avrei probabilmente avuto la funzione di prendere una funzione/blocco/lambda, come
recreate_views 'v1', 'v2' do
alter table base alter column name type text
end
è qualcosa di simile possibile? Ci sono delle utility là fuori che fanno qualcosa di simile?
'selezionare definizione dalla pg_views dove nomevista = 'v1'; 'fornisce la definizione della vista – dbenhur