Tengo un lugar VIEW
donde intento crear un script de evolución para poder agregarle una columna. Esa parte funciona bien; columna agregada muy bien. Sin embargo, lo contrario no funciona; eliminar esa última columna agregada falla con un ERROR: cannot drop columns from view
mensaje. El problema es que esta visión particular tiene muchas referencias, tanto desde como hacia, por lo tanto, ¡no puedo simplemente DROP CASCADE
la maldita cosa!
¿Hay alguna razón por la que no puedo eliminar una columna recién agregada de un determinado VIEW
? Entonces, ¿qué puedo hacer para lograr esta tarea?
(Nota: las circunstancias, aquí, son lo que son, pero puedo ver una situación similar, es decir, soltar una columna desde una vista, en muchos otros casos).
postgresql
view
postgresql-9.3
Yanick Rochon
fuente
fuente
ALTER VIEW ... ADD COLUMN
. Estas usandoCREATE OR REPLACE VIEW
? Muestra tu código por favor.CREATE OR REPLACE VIEW
con la misma definición, excepto una columna adicional (porque una tabla refinada tiene una nueva columna agregada, por lo que la vista debe incluirla). La "devolución" elimina la columna de la tabla ref'ed, por loVIEW
que tampoco tiene que devolverla más.Respuestas:
PostgreSQL (verdadero hasta al menos 9.4) actualmente no admite la eliminación de una columna con
CREATE OR REPLACE VIEW
.No hay una razón fundamental por la que no se pueda agregar soporte para soltar columnas, pero nadie ha hecho el trabajo requerido para implementarlo todavía.
CREATE OR REPLACE VIEW
tendría que escanear recursivamente todas las dependencias y asegurarse de que ninguna de ellas hiciera referencia a la columna a descartar. Si lo usaranSELECT *
, tendría que eliminar la columna de la expansión de*
la dependencia y luego escanear sus dependencias también. Hay un poco de trabajo involucrado en hacer eso, y hay algunas áreas en las que no está claro cómo debe comportarse exactamente la caída de la columna, especialmente cuando se trata de interacciones con volcado y recarga. Por lo tanto, nadie quería la función lo suficiente como para implementarla todavía. Los parches y / o patrocinio del desarrollo son bienvenidos.Tendrá que soltar la vista y todo lo que depende de ella, luego volver a crearla y sus dependencias. (Lo mismo solía ser cierto para agregar una columna a una vista; el soporte para agregar columnas se introdujo en 8.4).
Tenga en cuenta que, en general, no se espera que DDL sea reversible. El concepto de "devoluciones" es realmente defectuoso. Por ejemplo, si suelta una columna y luego la agrega nuevamente, los datos aún no están disponibles.
fuente