Como você concede permissão de execução para um único procedimento armazenado?

40

Normalmente, quando crio um procedimento armazenado, uso o seguinte como modelo de classificação

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

Existe uma maneira de incluir a concessão de permissão de execução apenas nesse procedimento armazenado enquanto eu estou nisso?
Por exemplo, como ...

Grant execute [User_Execute] 

... mas apenas para este procedimento armazenado?

Eu já vi outras perguntas semelhantes, mas todas parecem se referir a TODOS os procedimentos armazenados e não apenas a um, nem vi um em que você possa especificar permissões dentro do create procedurescript. Mesmo respostas sobre como eu posso definir permissões sem a GUI para procedimentos armazenados específicos serão bem-vindas.

Editar A resposta superior certamente me apontou na direção certa, isto é essencialmente o que eu estava procurando, não pensei em agrupar os comandos, o que acabei fazendo, agrupando o comando junto com o meu procedimento armazenado. Enfim, acho que é bem liso.

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO
DaneEdw
fonte
O código fornecido no texto editado é válido e a resposta correta para esta pergunta.
Ninty9notout 8/11

Respostas:

64
GRANT EXECUTE ON dbo.procname TO username;
Levi W
fonte
10

tabela truncada A configuração da permissão em objetos como procedimentos armazenados pode ser realizada com:

GRANT EXECUTE ON <schema>.<object> to <user>;

No entanto, você também pode querer conceder direitos de segurança nos níveis de logon e usuário. Você deseja determinar e conceder APENAS os direitos necessários para os objetos que requerem acesso (como execução). Considere o uso do EXECUTE ASrecurso que permite a representação de outro usuário para validar as permissões necessárias para executar o código SEM ter que conceder todos os direitos necessários a todos os objetos subjacentes (por exemplo, tabelas). EXECUTE ASpode ser adicionado a procedimentos armazenados, funções, gatilhos, etc.

Adicione ao código da seguinte maneira, dentro do Procedimento armazenado:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

Nesse caso, você está representando o proprietário do módulo que está sendo chamado. Você também pode se passar por SELF, OU o usuário que está criando ou alterar o módulo OU ... imperonar CHAMADA, que permitirá ao módulo assumir as permissões do usuário atual OU ... representar OWNER, que terá a permissão do o proprietário do procedimento chamado OR ... representa 'user_name', que representará um usuário específico OU ... representará 'login_name' com representará um logon específico.

Na maioria das vezes, você só precisará conceder EXECUTEdireitos aos procs armazenados e, em seguida, os direitos serão concedidos a todos os objetos referenciados no proc armazenado.

Dessa forma, você NÃO precisa fornecer direitos implícitos (exemplo: para atualizar dados ou chamar procs adicionais). O encadeamento de propriedade lida com isso para você. Isso é especialmente útil para sql dinâmico ou se você precisar criar tarefas de segurança elevadas, como CREATE TABLE. EXECUTE ASé uma ferramenta útil a considerar para eles.

Este exemplo pode ajudar a esclarecer tudo isso:

Crie um usuário chamado NoPrivUser com acesso público a um banco de dados (por exemplo, dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

NOTA: O CRIADOR OU O PROPRIETÁRIO DESTE PROCEDIMENTO EXIGIRÁ CRIAR DIREITOS DE TABELA no banco de dados de destino.

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

Com a EXECUTE AScláusula, o procedimento armazenado é executado no contexto do proprietário do objeto. Este código cria dbo.MyTablee as linhas são inseridas com sucesso. Neste exemplo, o usuário não NoPrivUsertem absolutamente nenhum direito concedido para modificar a tabela ou ler ou modificar qualquer dado desta tabela.

Ele assume apenas os direitos necessários para concluir esta tarefa específica codificada NO contexto do procedimento.

Esse método de criação de procedimentos armazenados que podem executar tarefas que exigem direitos de segurança elevados sem atribuir permanentemente esses direitos é muito útil.

Richard Ouimet
fonte
4
Esta é a mesma resposta que você postou ontem no SO , que também precisei formatar para facilitar a leitura.
Aaron Bertrand
5

insira a descrição da imagem aqui

selecione login no banco de dados -> Vá para Securable e clique no botão Search, como na imagem anterior. Ao clicar no botão Pesquisar, você encontrará a seguinte janela para adicionar o tipo de objeto.

Clique no botão Tipos de objeto e você verá a janela "Selecionar tipos de objeto" com vários objetos. Agora, se você vir, o procedimento armazenado está listado na área de tipos de objeto. Agora vamos selecionar nosso procedimento armazenado específico no qual queremos fornecer permissão.

arnav
fonte
Primeiro, a pergunta tinha mais de cinco anos quando você a respondeu. Isso seria bom, exceto que o OP solicitou especificamente soluções que não usam a GUI e podem ser incorporadas em um script. Sua resposta não aborda isso.
Eric Brandt