sql >> Base de Datos >  >> RDS >> PostgreSQL

Cambiar las columnas de PostgreSQL utilizadas en las vistas

Solución permanente para este caso

Para evitar el problema por completo, use el tipo de datos text o varchar / character varying sin un especificador de longitud en lugar de character varying(n) . Lea acerca de estos tipos de datos en el manual.

CREATE TABLE monkey(name text NOT NULL)

Si realmente desea imponer una longitud máxima, cree un CHECK restricción :

ALTER TABLE monkey 
  ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);

Puede cambiar o eliminar esa restricción en cualquier momento sin tocar objetos dependientes como vistas y sin obligar a Postgres a escribir nuevas filas en la tabla debido al cambio de tipo (que ya no siempre es necesario en la versión moderna de Postgres).

Explicación detallada

Según lo propuesto por @Michael, agrego más información general:

Una vista en PostgreSQL no es solo un "alias para la subconsulta". Las vistas se implementan como tablas especiales con una regla ON SELECT TO my_view DO INSTEAD . (Es por eso que puede alterar las vistas con un ALTER TABLE comando). Puede GRANT privilegios, agregar comentarios o incluso definir valores predeterminados de columna (útil para una regla ON INSERT TO my_view DO INSTEAD... ). Lea más en el manual aquí o aquí.

Si cambia los objetos subyacentes, también debe cambiar la consulta de definición de cualquier vista dependiente. El ALTER VIEW La declaración solo puede cambiar los atributos auxiliares de una vista. Use CREATE OR REPLACE VIEW para cambiar la consulta; conservará cualquier atributo adicional.

Sin embargo, si desea cambiar los tipos de datos de las columnas resultantes (como en el caso que nos ocupa), CREATE OR REPLACE VIEW no es posible. Tienes que DROP el viejo y CREATE una nueva vista Esto nunca eliminará ningún dato de las tablas subyacentes. será sin embargo, elimine cualquier atributo adicional de la vista, que también debe volver a crearse.