2010-03-27 91 views
19

Estoy actualizando un conjunto de registros en esa tabla, después de eso necesito hacer que esta tabla solo sea de lectura.¿Cómo hacer una tabla de solo lectura en SQL Server?

Entonces, ¿cómo hacer una tabla de solo lectura en SQL Server?

+0

Varias buenas respuestas aquí. Mi pregunta es: ¿para quién debe ser la mesa de solo lectura? SysAdmins siempre tiene el poder de hacer cualquier cosa, aunque puede tomarles tiempo y esfuerzo. –

+1

que no sean administradores del sistema – Jeyavel

Respuesta

29

Una alternativa sencilla que bloquearía la actualización e insertar en una tabla específica, pero que todavía permite borrar:

ALTER TABLE mytable WITH NOCHECK ADD CONSTRAINT chk_read_only CHECK(1 = 0) 

Tenga en cuenta: esto evita las inserciones y actualizaciones, pero permite eliminaciones.

Si realmente necesita una mesa para ser realmente sólo lectura que podría también bien:

a) poner en su propia base de datos o
b) ponerlo en un grupo de archivos y la marca que sólo leer, aquí está Cómo:

USE [master] 

GO 

ALTER DATABASE [csvtosp] ADD FILEGROUP [READONLYTABLES] 

GO 

ALTER DATABASE [csvtosp] ADD FILE (NAME = N'mydb_readonly_tables', FILENAME = N'G:\SQL2005DATA\mydb_readonly_tables.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB) TO FILEGROUP [READONLYTABLES] 

GO 

USE csvtosp 

GO 

DROP TABLE mytable 

CREATE TABLE mytable (

    somedata char(8000) not null 

) ON READONLYTABLES 

GO 

Para más detalles sobre este tema, vaya aquí:

How to make a table Read Only in SQL Server

+2

Intenté mejorar esta respuesta, pero mi edición fue rechazada. Agregue el código que falta para cómo hacer un grupo de archivos de solo lectura: 'ALTER DATABASE [csvtosp] MODIFY FILEGROUP [READONLYTABLES] READONLY' – Baodad

+0

1. El grupo de archivos' READONLYTABLES' no es READONLY 2. No hay necesidad de soltar la tabla para moverla a otro grupo de archivos . Solo necesita recrear el índice agrupado. –

2

Si lo quiere como solo para lectura para el público en general, pero aún desea poder editar la tabla en una fecha posterior, puede considerar crear múltiples usuarios para la base de datos y otorgar permisos diferentes a esa base de datos. Lo ideal sería que estar haciendo esto de todos modos y no permitir el acceso público en general para alterar mesa, etc. truncar

7
  1. gatillo con rollback trans
  2. grupo de archivos Sólo lectura
  3. no otorgan insertar/actualizar/borrar permisos

El número 3 es probablemente la mejor práctica. Por ejemplo, si su conexión es db_owner por ejemplo, entonces el desencadenante puede ser desactivado por el desencadenador o mover la tabla a un grupo de archivos diferente de todos modos.

Cuestiones relacionadas