Usando la base de datos de Postgres. Tengo una tabla existente y varias Vistas existentes que consultan esa tabla. Llame a la tabla, 'contactos'.
Modifico la tabla, cambiando el nombre a 'contacts_backup'. Luego creé una nueva tabla con el mismo nombre que la tabla anterior solía tener 'contactos'
Ahora parece que si consulto las vistas existentes, los datos todavía se recuperan de la tabla renombrada, contactos_respaldo, y no de la nueva tabla, 'contactos'.
¿Puede ser esto? ¿Cómo puedo actualizar las vistas para consultar la nueva tabla del mismo nombre y no la copia de seguridad de contactos renombrada?
Mi nueva mesa es en realidad una mesa extranjera, pero ¿no debería ser el principio el mismo? Esperaba que las tablas existentes realizaran consultas en la nueva tabla, no en la anterior con el nombre renombrado.
¿Cuál es una forma eficiente de actualizar las vistas existentes para consultar desde la nueva tabla?
Esto se debe a que PostgreSQL no almacena la definición de vista como una cadena SQL, sino como un árbol de consulta analizado.
Estos árboles de consulta analizados no contienen los nombres de los objetos a los que se hace referencia, sino solo su identificador de objeto ( oid ), que no cambia cuando cambia el nombre de un objeto. Lo mismo es cierto para las columnas de la tabla. Todo esto también se aplica a las mesas extranjeras.
Cuando examina la definición de la vista, por ejemplo con pg_get_viewdef , el árbol de análisis se representa como texto, por lo que verá los nombres cambiados.
Si desea cambiar la tabla a la que se refiere una vista, la única solución es DROP la vista y CREATE nuevamente, o puede usar CREATE OR REPLACE VIEW .