Normalmente, quando eu crio um procedimento armazenado, uso o seguinte como um 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 estou nele?
Por exemplo, como …
Grant execute [User_Execute]
… mas apenas para este procedimento armazenado?
Eu vi algumas outras perguntas semelhantes, mas elas parecem se referir a TODOS os procedimentos armazenados e não apenas um, nem vi um em que você pode especificar permissões dentro do script create procedure
. Mesmo respostas sobre como eu posso definir permissões sem a GUI para procedimentos armazenados específicos seriam bem-vindas.
Editar A resposta principal certamente me apontou na direção certa, é essencialmente isso que Eu estava procurando, não pensei em agrupar os comandos, que é o que acabei fazendo, agrupar o comando junto com meu procedimento armazenado. De qualquer forma, acho que é muito inteligente.
Create procedure <procedurename> <@param1 <type>, @param2 <type>, etc..> as begin <procedure> end GO GRANT EXECUTE ON <procedurename> to <username> GO
Comentários
- O código fornecido no texto editado é válido e a resposta correta para esta pergunta.
Resposta
GRANT EXECUTE ON dbo.procname TO username;
Resposta
truncar tabela A configuração de permissões em objetos como procedimentos armazenados pode ser realizada com:
GRANT EXECUTE ON <schema>.<object> to <user>;
No entanto, você também pode desejar conceder direitos de segurança em no nível de login e de usuário. Você desejará determinar e conceder SOMENTE os direitos necessários para os objetos que requerem acesso (como execução). Considere o uso do recurso EXECUTE AS
, 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 AS
pode 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
Neste caso, você está representando o proprietário do módulo que está sendo chamado. Você também pode personificar SELF, OU o usuário criando ou alterando o módulo OU … imperon CALLER, o que permitirá que o módulo assuma as permissões do usuário atual, OU … personifique OWNER, que terá a permissão do proprietário do procedimento sendo chamado OU … personificar “user_name”, que irá personificar um usuário específico OU … personificar “login_name” com irá representar um login específico.
A MAIORIA das vezes, você irá só precisa conceder EXECUTE
direitos aos procs armazenados e, em seguida, os direitos são concedidos a todos os objetos referenciados dentro do proc armazenado.
Desta forma, você NÃO precisa dê direitos implícitos (exemplo: para atualizar dados ou chamar procs adicionais). O encadeamento de propriedade cuida disso para você. Isso é especialmente útil para sql dinâmico ou se você precisar criar tarefas de segurança elevada, como CREATE TABLE
. EXECUTE AS
é uma ferramenta útil a se considerar para isso.
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 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 cláusula EXECUTE AS
, o procedimento armazenado é executado no contexto do proprietário do objeto. Este código cria dbo.MyTable
com sucesso e as linhas são inseridas com sucesso. Neste exemplo, o usuário NoPrivUser
absolutamente não tem direitos concedidos para modificar a tabela, ou ler ou modificar qualquer um dos dados nesta tabela.
Leva apenas sobre os direitos necessários para concluir esta tarefa específica codificada DENTRO do contexto deste procedimento.
Este método de criar procedimentos armazenados que podem executar tarefas que requerem direitos de segurança elevados sem atribuir permanentemente esses direitos é muito útil.
Comentários
- Esta é a mesma resposta que você postou no SO ontem , que Também tive que formatar para facilitar a leitura.
Resposta
selecione o login do banco de dados -> Vá para Protegível e clique no botão Pesquisar 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ê obterá 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 selecionaremos nosso procedimento armazenado específico ao qual desejamos fornecer permissão.
Comentários
- Primeiro, a pergunta tinha mais de cinco anos quando você a respondeu. Isso seria bom, exceto que o OP pediu especificamente soluções que não ' usam a GUI e podem ser incorporadas em um script. Sua resposta não aborda isso.