El permiso EXECUTE fue denegado en el objeto 'xxxxxxx', base de datos 'zzzzzzz', esquema 'dbo'

187

Tengo problemas para ejecutar una función.

Esto es lo que hice:

  1. Cree una función con SQL Server Management Studio. Fue creado con éxito.
  2. Luego intenté ejecutar la función recién creada y esto es lo que obtengo:

El permiso EXECUTE fue denegado en el objeto 'xxxxxxx', base de datos 'zzzzzzz', esquema 'dbo'.

Upendra Parmar
fuente
Si tiene el rol db_owner, el usuario puede ejecutar también (no es igual a otorgar exec ...)
hazjack
Recibí este error cuando había un error de sintaxis en mi instrucción SQL. Esencialmente me había fusionado GOy Createen GOCreate. Otros errores de sintaxis también parecen dar este error.
Ganesh Kamath - 'Code Frenzy'

Respuestas:

163

Parece que necesita otorgar el permiso de ejecución al usuario (o un grupo del que forman parte) para el procedimiento almacenado en cuestión.

Por ejemplo, podría otorgar acceso así:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC
Rowland Shaw
fuente
2
Hola, sé que fue hace un tiempo, pero tengo una pregunta. ¿Podría tal acción tener algunos problemas de seguridad? ¿Abre sp para ser utilizado por todos?
Valentyn Vynogradskiy
9
Sí, permite que cualquier persona con una conexión a la base de datos ejecute el procedimiento almacenado. Esperaría que las personas preocupadas por la seguridad otorguen acceso al grupo relevante en su base de datos .
Rowland Shaw
77
También puede usar GRANT EXEC TO PUBLICpara otorgar acceso a todos los objetos en la base de datos
sohaiby
2
Nunca otorgaría permisos de ejecución al rol público. De cualquier manera en nuestro entorno, se ordenó que se deshabilitara el rol público. Siempre otorgo permisos de ejecución a un usuario específico o un rol creado explícitamente para este propósito.
user1161391
44
¿Por qué todos están votando comentarios que sugieren otorgar derechos PÚBLICOS para ejecutar cualquier cosa en una base de datos? Ese es un caso especial, no el de facto.
Sábado Thiru
111

La mejor solución que encontré es crear un nuevo rol de base de datos, es decir

CREATE ROLE db_executor;

y luego otorgue a ese rol permiso ejecutivo.

GRANT EXECUTE TO db_executor;

Ahora, cuando vaya a las propiedades del usuario, vaya a Asignación de usuario y seleccione la base de datos donde ha agregado una nueva función, ahora la nueva función será visible en la membresía de la función de base de datos para: sección

Para más detalles lea el artículo completo

kazim
fuente
8
Esta respuesta es mejor si necesita otorgar EXECUTE para todos los SP a un inicio de sesión de usuario en particular, sin usar public o db_owner. Parece la respuesta más prudente y útil aquí.
jcollum
1
Por alguna razón, esta es la única respuesta que funciona para mí en SQL Server 2012. Darle a mi usuario permiso EXECUTE explícito no funciona. Solo funciona si hereda el permiso a través de un rol.
Keith el
1
Esta debería ser la respuesta. Funcionó como un encanto para mí. ¡Muchas gracias!
Shahbaaz
Luego agréguelo a la cuenta comoEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan
72

En SQL Server Management Studio:

solo ve a security->schema->dbo.

Haga doble clic en dbo, luego haga clic en permission tab->(blue font)view database permissiony siéntase libre de desplazarse por los campos obligatorios como "execute".Ayudarse a sí mismo para elegir usar granto denycontroles. Espero que esto ayude :)

Suhail Mumtaz Awan
fuente
52

necesitas ejecutar algo como esto

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]
Iain
fuente
44
Esto era lo que necesitaba, pero tenía que hacer en [domain\user]lugar de'domain\user'
Paul Stephenson
45

Esto funcionará si está intentando otorgar permiso a usuarios o roles.

Usando Microsoft SQL Server Management Studio:

  1. Ir a: bases de datos
  2. Haga clic derecho en dbo.my_database
  3. Elija: Propiedades
  4. En el panel lateral izquierdo, haga clic en: Permisos
  5. Seleccione el Usuario o Rol y en el Panel de nombres
  6. Encuentra Execute in en permisos y marca de verificación: Grant, With Grant o Deny
csebryam
fuente
¡Desafortunadamente, el usuario ya tiene permisos de ejecución! Por eso es tan confuso ...
Douglas Gaskell
Gracias Keim, esto está funcionando perfectamente cuando marque Grant
Rosh
16

Dar ese permiso puede ser peligroso, especialmente si su aplicación web usa ese mismo nombre de usuario.

Ahora el usuario web (y toda la red mundial) también tiene permiso para crear y soltar objetos dentro de su base de datos. Piensa en la inyección SQL!

Recomiendo otorgar privilegios de ejecución solo al usuario específico en el objeto dado de la siguiente manera:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Ahora el usuario myusernameNoquotes puede ejecutar el procedimiento almacenadoProcedureNameNoquotes sin otros permisos innecesarios a sus datos valiosos.

AMAR PANRAY
fuente
3

Si tiene problemas como la pregunta anterior con respecto a la excepción lanzada cuando se ejecuta la solución, el problema es el permiso, no otorgado adecuadamente a los usuarios de ese grupo para acceder a la base de datos / procedimiento almacenado. Todo lo que necesita hacer es hacer algo como lo que tengo a continuación, reemplazando el mío con el nombre de su base de datos, los procedimientos almacenados (función) y el tipo de permiso o función o a quién le está otorgando el acceso.

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ****** Objeto: StoredProcedure [dbo]. [GetAllEmployees] Fecha del script: 27/01/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End
Okwo Moisés
fuente
2

Puede dar permiso a todos para ejecutar:

GRANT Execute on [dbo].your_object to [public]

"Público" es la función de base de datos predeterminada de la que todos los usuarios son miembros.

philu
fuente
1

Me he enfrentado al mismo problema y lo resolví dando permiso a db_owner también para el usuario de la base de datos.

Singaravelan
fuente
11
no creo que esta sea una buena solución ... porque no puedo darle permiso a mi aplicación web ... No sé quién votará esto
Mina Gabriel
77
No recomendado, ya que esto es muy inseguro. Debería crear roles apropiados en lugar de usar db_owner que tiene control total sobre toda la base de datos
Yetiish
1

Si hace que este usuario sea especial para una base de datos específica, tal vez no lo configure como db_owner en la "asignación de usuario" de propiedades

Fatemeh M. Rezaie
fuente
1

será mejor que modifique las funciones del servidor, que fue diseñado para privilegios de seguridad. agregue el rol de servidor sysadmin a su usuario. para una mejor seguridad, puede tener sus roles de servidor personalizados. pero este enfoque te dará lo que quieres por ahora.

  1. Explorador de objetos -> Servidor -> Seguridad -> Inicios de sesión
  2. Haga clic derecho sobre el usuario deseado
  3. Vaya a Roles del servidor en el lado izquierdo
  4. Asegúrese de que sysadmin esté marcado
  5. Presione OK y reinicie su servidor SQL

Buena suerte

ingrese la descripción de la imagen aquí

Ali Kashanchi
fuente
1
sysadmin es una exageración total (y peligrosa)
Trubs
0

A continuación, le mostramos cómo dar permiso a un usuario que no sea público,

Consulta directa:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

Mando Basha
fuente