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
.