2009-01-09 30 views
7

Me encuentro con un problema donde no está funcionando la concesión de permisos de EJECUCIÓN en un procedimiento almacenado específico en SQL Server 2005. Algunos de los probadores se metieron con los permisos y descubrieron que si también otorgaban permisos de CONTROL en el Procedimiento almacenado, funcionaba bien. Ahora están convencidos de que otorgar permisos de CONTROL es el camino a seguir.¿Se debe otorgar el permiso CONTROL en un Procedimiento almacenado en SQL Server 2005?

Sé que esto no puede ser cierto, y de hecho, creo que el problema real es que el usuario no tenía permisos de Seleccionar/Insertar/Actualizar/Eliminar en las tablas con las que se ejecutó el Procedimiento almacenado. El problema es que parece que no puedo encontrar nada en línea que lo pruebe.

¿Es correcto? ¿Alguien sabe de alguna documentación que habla de esto?

Gracias de antemano.

Más información en respuesta a comentarios: El procedimiento almacenado está realizando varias eliminaciones. Primero elimina todos los registros que quedarán huérfanos por el registro "principal" que se está eliminando, y finalmente elimina el registro principal.

Además, el error que vemos indica que el usuario no tiene suficientes permisos o que el Procedimiento almacenado no existe. Ya hemos confirmado que estamos utilizando el usuario correcto y que se otorgaron permisos de EJECUTAR a ese usuario.

+0

Si otorga permiso de ejecución a un proceso almacenado, puede hacer todas las inserciones, actualizaciones y eliminaciones deseadas. Tendrás que decirnos qué más está haciendo la sp. –

+0

Oh sí ... lo siento por eso. El procedimiento almacenado está haciendo múltiples eliminaciones. Primero elimina todos los registros que quedarán huérfanos por el registro "principal" que se está eliminando, y finalmente elimina el registro principal. – leftend

+0

Además, el error que vemos indica que el usuario no tiene suficientes permisos, o que el Procedimiento almacenado no existe. Ya hemos confirmado que estamos utilizando el usuario correcto y que se otorgaron permisos de EJECUTAR a ese usuario. – leftend

Respuesta

4

Si el procedimiento almacenado se creó con EXECUTE AS CALLER (que creo que es el predeterminado), la persona que llama debe tener todos los permisos necesarios para hacer lo que hace el procedimiento almacenado además de EXECUTE en el procedimiento.

De la documentación de SQL Server para EXECUTE AS:

LLAMADAS Especifica las sentencias dentro el módulo se ejecutan en el contexto de la persona que llama del módulo. El usuario que ejecuta el módulo debe tener permisos adecuados no solo en el módulo , sino también en cualquier objeto de base de datos que tenga el como referencia por parte del módulo.

Tenga en cuenta que debido a los procesos de servidor de comprobaciones de permisos manera SQL utilizando las cadenas de propiedad, esto no siempre es del todo cierto, y supongo que la concesión de CONTROL en el procedimiento (que confiere el carácter de la propiedad al concesionario) es haciendo que estas verificaciones de permisos sean anuladas.

Si crea el procedimiento con EJECUTAR COMO PROPIETARIO, entonces no debería necesitar otorgar ningún permiso más allá de EJECUTAR en el procedimiento.

2

Ejecutar debería ser todo lo que se necesita.

¿El procedimiento almacenado está accediendo a una tabla fuera de la base de datos en la que se encuentra?

Si es así, intente configurar los permisos de usuario adecuados en las tablas que el procedimiento almacenado está utilizando fuera de la misma base de datos.

2

Si solo necesita poder ejecutar el procedimiento almacenado, entonces obviamente el permiso CONTROL es no el camino a seguir. Sí, funciona, de la misma manera que funciona ejecutando su sitio web bajo la cuenta del sistema local.

Si el otorgante del permiso EXECUTE también es el propietario de las tablas que se ven afectadas, entonces no debería haber problemas para ejecutar la sp. De lo contrario, debe otorgar permisos explícitos o considerar ajustar la propiedad con la instrucción ALTER AUTHORIZATION.

Para una administración adicional, cree una función de base de datos para aplicar permisos explícitos en lugar de asignarlos directamente a los usuarios.

1

Esto puede haberse resuelto, pero en mi caso la razón por la que necesitaba otorgar permiso de control (en un servidor de prueba, no en vivo) era porque el desarrollador original del procedimiento almacenado había omitido una declaración GO al diseñar así que la línea GRANT EXECUTE estaba dentro del procedimiento almacenado. Lo arreglamos en vivo, pero parece que la corrección nunca se implementó en la prueba.

Cuestiones relacionadas