Um aplicativo da Web precisa ser executado sys.dm_fts_parser
para descobrir quais palavras a Pesquisa de texto completo do SQL Server usou para corresponder documentos com a finalidade de realçar a sintaxe. Esse procedimento armazenado só pode ser executado se o chamador estiver na sysadmin
função de servidor.
Permissões
Requer associação na função de servidor fixa sysadmin e direitos de acesso à lista de palavras irrelevantes especificada.
http://msdn.microsoft.com/en-us/library/cc280463%28v=sql.105%29.aspx
Como seria muito imprudente conceder essa função de servidor ao usuário do servidor da Web, tentei criar um procedimento armazenado que é executado como um usuário separado que está nessa função.
create procedure usp_fts_parser
@query nvarchar(max)
with execute as owner
as
select display_term from sys.dm_fts_parser(@query, 1033, 0, 0);
go
Em seguida, criei um usuário login_sign_fts_parser
, tornei-o o proprietário do procedimento armazenado
altere a autorização em usp_fts_parser para login_sign_fts_parser
e tente permitir que os direitos de usuário do banco de dados do servidor web representem esse usuário:
GRANT IMPERSONATE ON USER::[IIS APPPOOL\Strategic Window] TO login_sign_fts_parser
Quando tento executar usp_fts_parser
, recebo o erro:
Não é possível executar como principal do banco de dados porque o principal "login_sign_fts_parser" não existe, esse tipo de principal não pode ser representado ou você não tem permissão.
Por que recebo esse erro? Como posso cumprir meu objetivo de execução sys.dm_fts_parser
sem conceder permissões indevidas ao usuário do banco de dados do servidor web?
O problema está na diferença entre logins e usuários. Ao conceder as permissões, você está trabalhando com um usuário. Apenas um login pode ter permissões de nível de servidor, como sysadmin. Eu discuti isso aqui se você estiver interessado.
Enquanto isso, posso lhe dizer como fazer o que você precisa, mas não é a melhor ideia do mundo.
Primeiro, crie um banco de dados separado, torne SA o proprietário desse banco de dados, defina a propriedade confiável para esse banco de dados. Em seguida, crie seu procedimento armazenado usp_fts_parser com EXECUTE AS OWNER. Neste caso, OWNER é dbo. Também neste caso dbo é SA. Como você tornou o banco de dados confiável, ele permitirá que os usuários acessem as permissões no nível do servidor. Tudo isso significa que seu procedimento armazenado poderá atuar como um administrador de sistema. Em seguida, conceda ao login que você está usando para o aplicativo da Web permissões de conexão para seu novo banco de dados. Em seguida, conceda a esse usuário permissões de execução no procedimento armazenado.
Isto é muito importante. SOMENTE conceda ao usuário permissões de execução no procedimento armazenado. Você criou uma grande brecha de segurança ao ativar o confiável com um banco de dados de propriedade de um administrador de sistema, então você precisa ter muito, muito, muito cuidado com quem você dá permissões para esse banco de dados e o que você permite que eles façam.