2010-09-23 35 views

Respuesta

15

La respuesta real es "depende", no hay absolutos.

El criterio básico es que tiene que haber una vista actualizable en la opinión del motor de base de, es decir, el motor puede identificar de forma exclusiva la fila (s) a ser actualizado y en segundo lugar están los campos actualizables. Si su vista tiene un campo calculado o representa el producto de una unión padre/hijo, entonces la respuesta predeterminada es probablemente no.

Sin embargo, también es posible hacer trampa ... en MS SQL Server y Oracle (por solo dos ejemplos) puede tener desencadenantes que se disparan cuando intenta insertar o actualizar una vista para que pueda hacer algo que el servidor no se puede actualizar en algo que sí lo es, generalmente porque tiene conocimiento de que el servidor no puede inferir fácilmente del esquema.

+1

"Depende": la respuesta favorita del profesional de la base de datos. 8-) –

+0

Demasiados años de ser un "programador" con demasiadas conversaciones con clientes/usuarios donde las respuestas agradables que pueden ser representadas por ceros y unas son muy pocas (-: – Murph

+0

También en Oracle, puedes crear ' En lugar de 'desencadenadores' que manejarán inserciones, actualizaciones y eliminaciones en una vista. –

1

Son sí - la sintaxis es la misma que la actualización de una tabla

Update MyView 
Set Col1 = "Testing" 
Where Col2 = 3 
Go 

Hay algunas condiciones para la creación de una vista que se puede actualizar. Se pueden encontrar here

EDIT:

debo añadir que se basa en MS SQL

+1

¿Por qué 'go'? No creo que sea una construcción SQL válida excepto SSMS. :) –

+0

@Denis - ¡Gracias! Me acabo de dar cuenta de que el OP ha etiquetado la pregunta Oracle y PostgreSQL. Oops – codingbadger

+0

Creo que su consulta funcionará en otros sistemas sin tener que ir. –

4

La respuesta correcta es "depende". Por ejemplo, no puede actualizar una columna agregada en una vista. Para las vistas de Oracle puede buscar en Google "vista de unión actualizable" para ver algunos ejemplos de cuándo puede y no puede actualizar una vista.

3

PostgreSQL tiene reglas para crear vistas actualizables. Consulte the examples in the manual para ver cómo usarlos.

Ps. En PostgreSQL, una VISTA es una REGLA, una regla de selección.

2

En el pasado no fue posible actualizar ninguna vista. El objetivo principal de una vista es mirar en los datos, de ahí el nombre. También podría llamarse consulta almacenada.

Hoy en día, muchos motores de base de datos admiten la actualización de vistas. Está sujeto a restricciones, algunas actualizaciones son prácticamente imposibles (por ejemplo, columnas calculadas, grupo por etc.).

2

Hay dos enfoques:

  1. EN LUGAR DE gatillo, que básicamente se desplaza el problema para el usuario. Usted escribe algún código de procedimiento que hace el trabajo. Ciertamente, no se garantiza la corrección, consistencia, etc.Desde la perspectiva del motor RDBMS, un disparador que borra todo de las tablas base, sin importar qué actualización se realice en la vista, está perfectamente bien.

  2. Mucho más ambicioso es ver las actualizaciones manejadas exclusivamente por el motor RDBMS. No se hace mucho progreso aquí: para decirlo suavemente, si tiene algunas buenas ideas allí, entonces puede lanzar una tesis de doctorado. En la práctica, su RDBMS favorito podría permitir algunas actualizaciones de vista limitadas de ad-hock; compruebe el manual de :-)

1

Cuando se crea una vista en SQL Server, los metadatos para las columnas de tabla referenciada (nombre de la columna y la posición ordinal) se conserva en la base de datos. Cualquier cambio en la (s) tabla (s) base referenciada (reordenación de columna, adición de nueva columna, etc.) no se reflejará en la vista hasta que la vista sea:

• Alterada con una instrucción ALTER VIEW • Recreado con DROP VIEW/CREATE VIEW statements • Actualizada mediante el procedimiento almacenado del sistema sp_refreshview

+1

Esta respuesta parece copiada directamente de [aquí] (https://www.mssqltips.com/sqlservertip/1427/ table-changes-not-automatically-reflected-in-a-sql-server-view /). – Pang

+0

buena observación: D – Ravi

1

Sí, son actualizables pero no siempre. Las vistas se pueden actualizar de la siguiente manera.

-Si la vista consiste en la clave principal de la tabla en función de la cual se ha creado la vista.

-Si la vista se define en base a una y solo una tabla.

-Si la vista no se ha definido utilizando grupos y funciones de agregado.

-Si la vista no tiene una cláusula específica en su definición.

-Si la vista que se supone que debe actualizarse se basa en otra vista, la última debe ser actualizable.

-Si la definición de la vista no tiene subconsultas.

Cuestiones relacionadas