2011-10-18 63 views
7

Según MSDN, las vistas compuestas de selecciones simples le permiten usar automáticamente las instrucciones de inserción/actualización/eliminación en la tabla. ¿Hay alguna forma de evitar esto? ¿Decirle a Sql Server que la vista es de solo lectura y que no puede usarla para modificar la tabla?Creación de vistas de solo lectura en el servidor Sql

Respuesta

12

La mejor manera sería eliminar los permisos UPDATE/DELETE/INSERT en la Vista.

Aparte de eso, puede crear un disparador INSTEAD OF en la vista que simplemente no hace nada para que las actualizaciones fallen silenciosamente o hay quite a few constructs that make views non updatable. Para que pueda elegir uno que no cambie la semántica o la eficiencia y luego lo viole.

Editar: Lo que sigue parece ajustarse a la factura.

CREATE VIEW Bar 
AS 
SELECT TOP 100 PERCENT x 
FROM foo 
WITH CHECK OPTION 
+0

+1 permisos deben evitar esto, no el código. Pero si la gente puede escribir a través de la vista, entonces sospecho que también hay permisos en las tablas base ... – gbn

+0

Gracias, funciona como un encanto. Esas vistas se referirán a otra base de datos a la que el usuario no tendrá acceso. Quiero que sean de solo lectura para que el usuario no pueda modificar esa base de datos a la que no tiene acceso a través de las vistas en la base de datos a la que tiene acceso. Quiero usar permisos por base de datos en lugar de permisos por objeto para mantener las cosas simples y estar más seguro de que no omito una infracción en las definiciones de permisos. –

+3

Señalaré un peligro con el código adjunto al final. Parece depender de la 'OPCIÓN DE CHEQUE'. Si vuelve y edita tarde la Vista con SQL Server Management Studio, no incluirá la opción 'WITH CHECK OPTION' y la vista se leerá/escribirá nuevamente. – BIBD

7

puede especificar un operador UNION con el fin de hacer que SQL Server falla durante el INSERT/UPDATE/DELETE operación, así:

create view SampleView 
as 
    select ID, value from table 
    union all 
    select 0, '0' where 1=0 

La última consulta no devuelve ninguna fila en absoluto, pero debe tener la misma cantidad de campos con los mismos tipos de datos que la primera consulta, para poder usar el UNION de forma segura. Consulte este enlace para obtener más información: Different ways to make a table read only in a SQL Server database

+0

También puede agregar un "UNION SELECT TOP 0 * FROM table" (al menos en SQLServer 2014). – Christoph

Cuestiones relacionadas