A permissão EXECUTE foi negada no objeto 'xxxxxxx', banco de dados 'zzzzzzz', esquema 'dbo'

187

Estou tendo problemas para executar uma função.

Aqui está o que eu fiz:

  1. Crie uma função usando o SQL Server Management Studio. Foi criado com sucesso.
  2. Eu tentei executar a função recém-criada e aqui está o que eu recebo:

A permissão EXECUTE foi negada no objeto 'xxxxxxx', banco de dados 'zzzzzzz', esquema 'dbo'.

upendra parmar
fonte
Se ter db_owner, o usuário pode executar também (não é igual a conceder exec ...)
hazjack
Eu recebi esse erro quando houve um erro de sintaxe na minha instrução SQL. Essencialmente eu tinha fundido GOe Createem GOCreate. Outros erros de sintaxe também parecem fornecer esse erro.
Ganesh Kamath - 'Code Frenzy'

Respostas:

163

Parece que você precisa conceder a permissão de execução ao usuário (ou a um grupo do qual ele faz parte) para o procedimento armazenado em questão.

Por exemplo, você pode conceder acesso assim:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC
Rowland Shaw
fonte
2
Olá, eu sei que foi há pouco tempo, mas tenho uma pergunta. Essa ação pode ter alguns problemas de segurança? Abre sp para ser usado por todos?
Valentyn Vynogradskiy
9
Sim, permite que qualquer pessoa com uma conexão com o banco de dados execute o procedimento armazenado. Eu esperaria que as pessoas preocupadas com a segurança concedessem acesso ao grupo relevante em seu banco de dados .
Rowland Shaw
7
Você também pode usar GRANT EXEC TO PUBLICpara conceder acesso a todos os objetos no banco de dados
sohaiby
2
Eu nunca concederia permissões de execução à função pública. De qualquer forma, em nosso ambiente, foi determinado que a função pública fosse desativada. Eu sempre concedo permissões de execução a um usuário específico ou a uma função criada explicitamente para esse fim.
user1161391
4
por que todos os comentários votantes sugerem dar ao PUBLIC direitos para executar qualquer coisa em um banco de dados? Esse é um caso especial, não o defacto.
precisa
111

A melhor solução que encontrei é criar uma nova função de banco de dados, ou seja

CREATE ROLE db_executor;

e conceda a permissão executiva dessa função.

GRANT EXECUTE TO db_executor;

Agora, quando você acessa as propriedades do usuário, acessa Mapeamento do Usuário e seleciona o banco de dados em que você adicionou uma nova função, agora a nova função estará visível na associação da função Banco de Dados para: seção

Para mais detalhes, leia o artigo completo

kazim
fonte
8
Essa resposta é melhor se você precisar conceder EXECUTE para todos os SPs a um login de usuário específico - sem usar public ou db_owner. Parece a resposta mais prudente e útil aqui.
Jcollum 26/10/2015
1
Por algum motivo, esta é a única resposta que funciona para mim no SQL Server 2012. Conceder ao meu usuário permissão EXECUTE explícita não funciona. Funciona apenas se herdar a permissão por meio de uma função.
Keith
1
Essa deve ser a resposta. Funcionou como um encanto para mim. Muito obrigado!
Shahbaaz 18/05/19
Em seguida, adicione-o à conta comoEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan 26/03
72

No Sql Server Management Studio:

apenas vá para security->schema->dbo.

Clique duas vezes em dbo, clique permission tab->(blue font)view database permissione sinta-se à vontade para rolar pelos campos obrigatórios, como "execute".Ajude a si mesmo a escolher o uso grantou os denycontroles. Espero que isso ajude :)

Suhail Mumtaz Awan
fonte
52

você precisa executar algo parecido com isto

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]
Iain
fonte
4
Era disso que eu precisava, mas eu tinha que fazer, em [domain\user]vez de'domain\user'
Paul Stephenson
45

Isso funcionará se você estiver tentando conceder permissão a usuários ou funções.

Usando o Microsoft SQL Server Management Studio:

  1. Vá para: Bancos de dados
  2. Clique com o botão direito do mouse em dbo.my_database
  3. Escolha: Propriedades
  4. No painel esquerdo, clique em: Permissões
  5. Selecione o usuário ou função e no painel de nomes
  6. Encontre Executar nas permissões e marque: Conceder, Conceder ou Negar
csebryam
fonte
Infelizmente, o usuário já possui permissões de execução! É por isso que este é tão confuso ....
Douglas Gaskell
Graças Keim isso está funcionando perfeitamente quando eu marque Grant
Rosh
16

Conceder essa permissão pode ser perigoso, especialmente se o seu aplicativo da Web usar o mesmo nome de usuário.

Agora, o usuário da web (e toda a web) também tem permissão para criar e soltar objetos no seu banco de dados. Pense em injeção SQL!

Eu recomendo conceder privilégios de execução apenas para o usuário específico no objeto especificado da seguinte maneira:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Agora, o usuário myusernameNoquotes pode executar o procedimento storedProcedureNameNoquotes sem outras permissões desnecessárias para seus dados valiosos.

AMAR PANRAY
fonte
3

Se você tiver problemas como a pergunta acima, relacionada à exceção lançada quando a solução é executada, o problema é a permissão, não concedida adequadamente aos usuários desse grupo para acessar o banco de dados / procedimento armazenado. Tudo o que você precisa é fazer algo como o que eu tenho abaixo, substituindo o meu pelo nome do banco de dados, procedimentos armazenados (função) e o tipo de permissão ou função ou a quem você está concedendo acesso.

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

/ ****** Objeto: StoredProcedure [dbo]. [GetAllEmployees] Data do 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 moses
fonte
2

Você pode dar a todos permissão de execução:

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

"Público" é a função de banco de dados padrão da qual todos os usuários são membros.

philu
fonte
1

Eu enfrentei o mesmo problema e resolvi dar permissão ao db_owner também para o usuário do banco de dados.

Singaravelan
fonte
11
Eu não acho que esta é uma boa solução ... porque eu não posso dar a minha aplicação web essa permissão .. eu não sei quem up vote este
Mina Gabriel
7
Não recomendado, pois isso é muito inseguro. Você deve criar funções apropriadas em vez de usar db_owner que tem total controle sobre todo o banco de dados
Yetiish
1

Se você tornar esse usuário especial para um banco de dados específico, talvez não o configure como db_owner no "mapeamento do usuário" das propriedades

Fatemeh M. Rezaie
fonte
1

é melhor modificar as funções de servidor, que foram projetadas para privilégios de segurança. adicione a função de servidor sysadmin ao seu usuário. para maior segurança, você pode ter suas funções de servidor personalizadas. mas essa abordagem fornecerá o que você deseja por enquanto.

  1. Pesquisador de Objetos -> Servidor -> Segurança -> Logins
  2. Clique com o botão direito do mouse no usuário desejado
  3. Vá para Funções do servidor no lado esquerdo
  4. Verifique se sysadmin está marcado
  5. Clique em OK e reinicie o servidor SQL

Boa sorte

insira a descrição da imagem aqui

Ali Kashanchi
fonte
1
sysadmin é um exagero total (e perigoso)
Trubs
0

aqui está como conceder permissão para um usuário não público,

Consulta direta:

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

Mando Basha
fonte