Temos uma ferramenta de monitoramento que pode verificar se os trabalhos do Microsoft SQL Server foram executados com sucesso. O que eu quero fazer é criar um usuário que tenha o mínimo de permissão possível, mas que possa observar o log do histórico para ver se o trabalho foi concluído.
Que função devo atribuir ao usuário?
Edit: Os servidores são Microsoft SQL Server 2005 a 2012
Para poder verificar todos os trabalhos, você precisa adicionar o usuário ao SQLAgentReaderRole no banco de dados msdb, que também dá a esse usuário permissão para criar trabalhos. Para minimizar o acesso concedido, você também pode conceder ao usuário permissão de seleção nas tabelas usadas pelo agente do servidor sql
Se "observar o log do histórico para ver se o trabalho foi concluído" puder ser realizado usando um procedimento armazenado, uma função escalar ou uma função com valor de tabela (em oposição ao
SELECT
acesso direto àsmsdb.dbo.sysjob*
tabelas), você poderá sair sem conceder nenhum permissões para qualquer login/usuário real que fará login. Você ainda criará pelo menos um login e possivelmente também um usuário (mas possivelmente não), mas nenhuma pessoa ou código de aplicativo se conectará ao SQL Server usando este login . A ideia é usar a assinatura do módulo para conceder permissões por proxy/indiretamente. Eu detalhei o método (bem, a primeira parte para este uso específico) na seguinte resposta:Quais permissões mínimas preciso fornecer a um usuário para que ele possa verificar o status do SQL Server Agent Service?
Uma diferença entre este caso e o da resposta é que, em vez de uma permissão no nível do servidor necessária para visualizar as informações do DMV, este caso aqui precisa de uma função no nível do banco de dados. Portanto, as etapas adicionais além do que é discutido nessa resposta vinculada são:
VIEW SERVER STATE
permissão de nível de servidor para o Loginmsdb
msdb
partir desse certificadomsdb
a função de banco de dados deSQLAgentReaderRole
Você pode criar um procedimento armazenado ou uma função escalar que aceite um parâmetro para o nome do trabalho se desejar verificar apenas um trabalho por vez. Ou você pode criar uma função com valor de tabela se quiser obter o status de vários trabalhos. Em ambos os casos, você fornece a consulta nesse procedimento ou função armazenada e concede acesso a quem quer que seja apenas nesse procedimento ou função armazenada. Esse método permite que você dê acesso apenas a essa consulta e não a qualquer outra coisa implícita na
SQLAgentReaderRole
função.Ou você pode permitir um acesso de consulta ad hoc de forma mais livre criando uma função com valor de tabela para cada tabela necessária para qualquer consulta desejada (ou talvez alguns JOINs possam ser feitos em alguns dos TVFs) e assiná-los. Então, quem quer que você conceda
SELECT
permissão nesses TVFs pode fazer suas próprias consultas. A única desvantagem é que os TVFs precisam ser de várias instruções e não podem ser TVFs embutidos, mas para esse cenário específico, isso deve funcionar na maioria dos casos, pois essas consultas não devem ser executadas várias vezes por segundo ;-).