2009-08-13 1151 views
11

Estoy haciendo bastante back-end desarrollando en los últimos días, y como estamos trabajando con scripts centrales de bases de datos, simplemente escribo simple actualización de SQL. scripts y ejecútelos en la base de datos. Bien y todo, pero ¿por qué tiene que escribir scripts 'actualizar vista', y ejecutarlos cada vez que agregue o edite algunos campos a una vista.¿Por qué SQL Server Views necesita actualizarse de vez en cuando?

SQL Server entiende que necesita actualizar la vista al editarla en la elegante ventana de edición de vistas en Management Studio, así que ¿por qué no puede decir que se va a actualizar después de editar la vista a través de un script?

Respuesta

9

Las vistas deben actualizarse si las tablas subyacentes cambian en absoluto. Eso puede cambiar los tipos de datos de las columnas de la vista o reorganizar sus índices. Por lo tanto, necesita saber. De lo contrario, ejecutaría una consulta en su contra, y estallaría bastante rápido.

No debería tener que ejecutar sp_refreshview para modificar una vista. Solo para alterar sus tablas subyacentes.

Además, no se burle de la diversión feliz.

Editar: Simplemente ejecute este código (en sucesión) para intentar reproducir su problema. Yo era, por desgracia, no puede hacerlo, ya que trabajó como se esperaba (SQL Server 2008):

create view MyView 
as 
select ProductKey, ProductID, ProductName, Price 
from dbo.Products 

select v.* from MyView v 

alter view MyView 
as 
select ProductKey, ProductID, ProductName, Price*100 as MyPrice 
from dbo. Products 

select v.* from MyView v 
+1

Pero este comportamiento también ocurre cuando tengo algo como SELECT b. * FROM b. Después de agregar columnas a b, la vista intenta mostrar las columnas antiguas, aunque no estén codificadas. –

+0

Los comentarios de Eric aún se mantienen. Los metadatos de la vista deben actualizarse cada vez que se cambie el esquema de las tablas subyacentes, incluso si el código de la vista permaneciera de lo contrario correcto. – TimothyAWiseman

3

Uso WITH SCHEMABINDING en la definición de vista para eliminar la necesidad de cualquier refresca

Y en combinación con ALTER VIEW, no el diseñador

Editar, jul 2012, desde el enlace de arriba. Mi negrita

SCHEMABINDING

Se liga la vista al esquema de la tabla o tablas subyacentes. Cuando se especifica SCHEMABINDING, la tabla base o las tablas no se pueden modificar de forma que afecten a la definición de vista. La definición de la vista en sí misma primero debe modificarse o eliminarse para eliminar las dependencias de la tabla que se va a modificar. Cuando utiliza SCHEMABINDING, select_statement debe incluir los nombres de dos partes (schema.object) de tablas, vistas o funciones definidas por el usuario a las que se hace referencia. Todos los objetos referenciados deben estar en la misma base de datos.

Las vistas o tablas que participan en una vista creada con la cláusula SCHEMABINDING no pueden soltarse a menos que esa vista se pierda o cambie para que ya no tenga el esquema vinculante. De lo contrario, el Motor de base de datos genera un error. Además, la ejecución de las sentencias ALTER TABLE en tablas que participan en vistas que tienen un enlace de esquema falla cuando estas sentencias afectan a la definición de la vista.

+3

Dudé en sugerir esto. 'WITH SCHEMABINDING' * only * funciona si todas las tablas están en la misma base de datos en el mismo servidor. – Eric

+1

El uso de schemabinding eliminaría la necesidad de renovaciones porque evita que se cambien las tablas subyacentes.Lo mejor que esto podría hacer si tiene que cambiar las tablas subyacentes es darle un recordatorio de que necesita actualizar la vista luego al eliminar el con schemabinding para realizar el cambio. – TimothyAWiseman

+1

¿No veo cómo evitar el cambio es equivalente a eliminar la necesidad de renovaciones? ¿A menos que esté equivocado que con SCHEMABINDING evitará que se cambien las tablas subyacentes? – ErikE

Cuestiones relacionadas