2010-03-28 18 views
10

Al usar SQL Server 2008, ¿hay alguna manera de permitir inserciones en una tabla solo a través de un procedimiento almacenado y, de ser así, cómo?Forzar INSERT solo a través del procedimiento almacenado

EDIT:
El mejor camino a seguir es, probablemente, la sugerencia de Martin Smith a utilizar un disparador INSTEAD OF INSERT. La respuesta directa a esta pregunta es la de marc_s con GRANT y DENY, aunque no limitará algunas cuentas de usuario.

+0

duplicado posible de [procedimiento almacenado y permisos - se limitan a ejecutar lo suficientemente ?] (http://stackoverflow.com/questions/3815411/stored-procedure-and-permissions-is-execute-enough) –

Respuesta

9

Simplemente no conceda a los usuarios de la base de datos (y su función "pública") el permiso INSERT en la tabla.

Otorgue a esos usuarios el permiso para ejecutar el proceso almacenado INSERTAR - de ese modo, pueden llamar al proceso almacenado, pero no pueden insertar directamente ningún dato en la tabla subyacente.

DENY INSERT ON dbo.YourTable TO PUBLIC 
GRANT EXECUTE ON dbo.InsertDataProc TO PUBLIC 
+0

Esta es la * única * forma ... suponiendo que la conexión no es db_owner o sysadmin ... – gbn

+0

Esto no funciona para mí. Obtengo 'El permiso INSERT fue denegado en el objeto ... 'incluso cuando estoy ejecutando un procedimiento almacenado que hace el INSERT. Estoy usando SQL 2012. Ah, acabo de enterarme de que esto se debe a que esta respuesta no funcionará si INSERT se hace con SQL dinámico dentro del proceso. –

6

Denegar INSERT permiso en la tabla y otorgar el permiso EXECUTE sobre el procedimiento almacenado.

2

Permisos de uso (concesiones). Cree el SP y otorgue el execute derecho al usuario o rol en cuestión. Luego niegue el insert directamente sobre la mesa y debería estar todo listo.

4

¿Cuál es la motivación para la pregunta? ¿Se debe a que el procedimiento almacenado contiene cierta lógica en la que usted confía que se llevará a cabo cada vez que se inserten datos? Si es así, es posible que desee utilizar un disparador para encapsular esta lógica.

Si eso no es adecuado y desea evitar que incluso las personas con permisos sysadmin se inserten en la tabla directamente, no puede hacerlo, pero puede asegurarse de que no ocurra accidentalmente mediante el uso de un disparador INSTEAD OF INSERT que genera un error y revierte a menos que un cierto valor CONTEXT_INFO se establece a continuación despeja el CONTEXT_INFO (Su procedimiento almacenado pueda establecer a un valor esperado)

http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx

Cuestiones relacionadas