valor tabla stored retorno retornar procedimientos procedimiento parametros obtener guardar entrada ejecutar devolver datos con como almacenados almacenado sql-server stored-procedures permissions

sql server - tabla - Procedimiento almacenado y permisos: ¿es suficiente EJECUTAR?



procedimientos almacenados en sql server 2008 (5)

¡MUCHAS GRACIAS! Tuve un problema similar. Esto me lleva a la respuesta.

Intentaba truncar una tabla en un procedimiento almacenado que llamaba a otros procedimientos almacenados que estaban anidados en las instrucciones IF.

Mi error fue

El servidor principal "dominio / mi_id" no puede acceder a la base de datos "2nd_DB" en el contexto de seguridad actual.

Le había otorgado a los derechos de procedimiento almacenados de llamada para hacer el truncado ( EJECUTAR COMO AUTORIZACIÓN ), lo que provocó un problema porque SELF no tenía derechos para la 2da base de datos. Nuestra solución fue mover el truncado a otro SP, incluir el EXECUTE AS SELF. Ahora llamamos al SP truncado, ejecutamos nuestro procesamiento de datos, hacemos una determinación lógica y llamamos al 3er SP apropiado.

Tengo una base de datos de SQL Server 2008 donde todo el acceso a las tablas subyacentes se realiza a través de procedimientos almacenados. Algunos procedimientos almacenados simplemente SELECCIONAN registros de las tablas mientras que otros ACTUALIZAN, INSERTAN y ELIMINAN.

Si un procedimiento almacenado ACTUALIZA una tabla, ¿el usuario que ejecuta el procedimiento almacenado también necesita permisos de ACTUALIZACIÓN para las tablas afectadas o es el hecho de que tienen permisos de EJECUTAR el procedimiento almacenado lo suficiente?

Básicamente me pregunto si dar al usuario permisos de EJECUTAR a los procedimientos almacenados es suficiente o si tengo que darles SELECCIONAR, ACTUALIZAR, ELIMINAR e INSERTAR permisos a las tablas para que funcionen los procedimientos almacenados. Gracias.

[EDITAR] En la mayoría de mis procedimientos almacenados parece que EJECUTAR es suficiente. Sin embargo, encontré que en procedimientos almacenados donde se usaba "Execute sp_Executesql", EXECUTE no era suficiente. Las tablas involucradas deben tener permisos para las acciones que se realizan dentro de "sp_Executesql".


Ejecutar permisos en el procedimiento almacenado es suficiente.

CREATE TABLE dbo.Temp(n int) GO DENY INSERT ON dbo.Temp TO <your role> GO CREATE PROCEDURE dbo.SPTemp(@Int int) AS INSERT dbo.Temp SELECT @Int GO GRANT EXEC ON dbo.SPTemp TO <your role> GO

Entonces el usuario (no propietario de db) tendrá los siguientes derechos:

EXEC dbo.SPTemp 10 GO INSERT dbo.Temp --INSERT permission was denied on the object ''Temp'' SELECT 10

Sin embargo, si hay SQL dinámico dentro de dbo.SPTemp que intenta insertarse en dbo.Temp, entonces eso fallará. En este caso, será necesario otorgar permiso directo sobre la mesa.


Ejecute el permiso en un procedimiento almacenado que haga una inserción, actualización o eliminación es suficiente. No necesita otorgar esos permisos en el nivel de la tabla. De hecho, desalentaría ese enfoque. El uso de un procedimiento almacenado le brinda más control sobre cómo se produce el cambio. Por ejemplo, es posible que desee hacer algunas comprobaciones antes de permitir la actualización. Usar un procedimiento almacenado también puede ayudar a prevenir accidentes graves, como eliminar todas las filas de la tabla porque alguien olvidó la cláusula WHERE.


Los permisos en las tablas no están marcados (incluido DENY) si las tablas y el proc tienen el mismo propietario. También pueden estar en esquemas diferentes siempre que los esquemas tengan el mismo propietario.

Consulte Encadenamiento de propiedad en MSDN

Editar, a partir de un comentario de una respuesta eliminada.

El contexto es siempre el inicio de sesión actual a menos que EXECUTE AS como se haya utilizado: solo los permisos DML de objeto referenciados no están marcados. Pruebe OBJECT_ID (tabla de referencia) en un proceso almacenado donde no se asignan derechos a la tabla de referencias. Da NULL. Si el propietario del proceso almacenado lo ejecuta, le daría un valor porque el propietario tiene derechos sobre la tabla de referencia.


Quizás puedas usar

"con ejecutar como propietario"

cuando crea el procedimiento almacenado, como a continuación:

create procedure XXX with execute as owner as begin ... end go

Entonces solo necesita otorgar al usuario el permiso EXECUTE para el procedimiento almacenado XXX .