Tenho uma pergunta sobre os tipos de tabelas definidas pelo usuário no SQL Server 2008.
Para a necessidade de um dos aplicativos ASP.NET, definimos nossos próprios tipos de tabela no SQL Server 2008 para usá-los como parâmetros nos procedimentos armazenados (ao executar o comando sql no aplicativo ASP.NET, passamos o objeto DataTable como parâmetro para o procedimento armazenado veja aqui um exemplo )
O problema é que quando executamos o comando Sql (execute stored procedure) no ASP.NET, obtemos um erro:
A permissão EXECUTE foi negada no objeto 'ourTableType', banco de dados 'ourDatabase', esquema 'ourSchema'.
Por que? Por que precisamos definir permissões em tipos de tabela definidos pelo usuário? Por que não é suficiente ter permissão definida apenas no procedimento armazenado que a usa? E se temos que defini-lo não importa o quê, por que não há EXECUTE
tipo de permissão para definir na janela de propriedades de qualquer natureza (eu posso ver apenas Control
, References
, Take Ownership
, View Definition
)?
O que também não entendo é que definir permissão para Control
na janela de propriedades resolve o problema e o procedimento armazenado é executado sem problemas.
AS dbo
no final. Como esta:GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo
. Funcionou para mim.Respostas:
Eu realmente espero que você tenha resolvido isso agora, visto que a pergunta tem quase 4 meses, mas caso você não tenha resolvido, aqui está o que eu acho que é a resposta.
fonte
Se o procedimento armazenado estiver usando sql dinâmico, o que significa que o
@sql
é gerado e executado por meioexec @sql
, você precisará de permissão concedida nas tabelas subjacentes.Uma solução alternativa é modificar o procedimento armazenado para ser executado como um usuário diferente . Se você fizer com que seja executado como SELF, ele será executado sob o criador do procedimento armazenado, o que é extremamente perigoso. Ainda assim, se você não tiver outra opção:
fonte
INSERT INTO
instruções de tabela gerais e ´UPDATE´, para as quais este usuário tem todas as permissões de que precisa. Além disso, este usuário / login é especialmente reservado / criado para esta aplicação ASP.NET para ser capaz de se conectar a este banco de dados e apenas executar procedimentos armazenados (não criar etc, o criador é sempre'sa'
).