O servidor SQL emite mensagens quando algum evento importante ( digno de nota ) ocorre. Pode ser uma mensagem só de informação ou mesmo uma mensagem de erro. O Alerta permite 'atrelar' a emissão dessa mensagem com uma tarefa, digamos emitir um e-mail, informando sobre a mensagem emitida. O servidor SQL pode simplesmente enviar um e-mail ( ser passivo no problema ) ou executar uma tarefa para a recuperação do problema ( ser ativo e tentar corrigir o problema). Abaixo explico melhor o que sumarizei neste parágrafo.
Dizemos que no SQL Server não tem nada grátis. Sabemos que ao colocar um servidor no ar implementamos uma solução para a empresa e, como isso não é de graça, nossos problemas só começam depois disso.
Depois que tá tudo instalado e funcionando vem as tarefas de administração do servidor. As tarefas vão de coisas bem simples, como as atualizações do windows até um backup, um dbcc checkb para verificar a integridade do servidor, etc. Algumas tarefas admistrativas podem ser automatizadas e outras não.
É muito comum escolher um horário de baixa utilização do servidor para fazer os backups, as verificações de integridade, compactação das bases de dados, etc.
Uma das tarefas da rotina de um dba é manter o servidor funcionando perfeitamente. Essa garantia é, muitas vezes, fundamental para que a empresa crie negócios, atenda bem seus clientes, controle seus processos da maneira mais eficiente possível.
Dependendo da atividade do servidor, do número de servidores, do ambiente onde estão instalados esta tarefa é coisa simples e, em outros casos, absolutamente impossível. Nestes casos toda ajuda que o dba puder receber para sanar o problema de um servidor o mais rápido possível e ir para o próximo é muito bem vinda.
Outra coisa interessante é se o servidor pudesse 'corrigir' o problema sozinho executando uma tarefa de manutenção ou mesmo uma atividade para prevenir que não aconteça novamente ou o mesmo erro futuramente.
O alerta pode ser dos níveis mais simples como quando um item ultrapassa um certo valor. Por exemplo, meu servidor tem 64 giga-bytes de ram e ao atingir 55 gb de ram utilizadas eu quero que ele me alerte sobre uma possível falha causada por falta de memória.
Um alerta pode ser disparado por um item mais 'superior' do sql como a segurança do servidor ou mesmo de integridade do banco de dados sql.
É exatamente isso que faz um alerta no Microsoft SQL Server... facilita ou automatiza as tarefas de manutenção e administração do servidor SQL .
Tudo que possa ocorrer no servidor tem uma mensagem associada a esse 'evento'. Você pode provocar um erro no sql de 10.000 maneiras. Dessas 10.000 maneiras 9.900 são criando pesquisas e 100 rodando elas. Sendo assim, a seguir dou um exemplo de como gerar uma pesquisa que gera um erro ao ser executada :
-- Gerando o erro de divisão por zero.
BEGIN TRY
SELECT 1/0; --<-- Aqui tá o erro
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [Número do Erro];
END CATCH;
GO
Rodando a pesquisa acima geramos o erro matemático de divisão por zero e, como cada mensagem do SQL Server tem um número , o número do erro gerado é 8134
Note que o try...catch é o mecanismo de trapeamento ( captura ) de erros do SQL Server e ele consegue detectar qualquer erro do SQL Server. Contudo erros como a perda da conexão TCP-IP do servidor são tratadas pelo sistema operacional e não são 'trapeáveis' pelo try..catch do SQL Server.
O servidor sql tem que estar preparado para trabalhar com o idioma do cliente seja lá qual ele for. Sendo assim todo servidor sql tem milhares de mensagens para dezenas de idiomas. Caso queira saber quais idiomas seu servidor sql pode emitir as mensagens de erro faça a pesquisa :
select * from sys.syslanguages.
A pesquisa acima retorna todos os idiomas das mensagens do servidor. Na minha pesquisa retornou 34 idiomas.
Se quiser saber qual é o idioma Português - Brasil faça a pesquisa:
select * from sys.syslanguages where lcid = 1046 --idioma Português - Brasil
Vamos começar vendo as mensagens que o servidor pode emitir...
--mensagens do ms sql
select text
from sys.messages
where language_id = 1046 --<-- Português - Brasil
Fazendo a pesquisa acima descobrimos que temos 15.682 mensagens e só em Português-Brasil (language_id = 1046).
Acho que sempre terá uma para o que você precisar fazer.
Vamos melhorar a pesquisa...quero procurar uma mensagem que tenha 2 textos nela : 'log' e 'cheio'
select *
from sys.messages
where language_id = 1046
and text like '%log%'
and text like '%cheio%'
Fazendo a pesquisa acima retorna 3 mensagens e a que eu vou usar como demostração é a 'O log de transações do banco de dados '%1!' está cheio devido a '%2!' e o LSN de retenção é %3!.' que tem message_id = 9002
Importante: Para mudar o idioma da mensagem basta mudar o language_id. A mensagem é a mesma para todos os idiomas.
select * from sys.messages where language_id = 1046 and message_id = 9002 --pt-br
select * from sys.messages where language_id = 1033 and message_id = 9002 -- us
Sendo assim, localizando a mensagem emitida pelo SQL Server podemos criar um alerta para quando ela é emitida.
Para criar um alerta entre no SQL Server Management Studio e selecione as tarefas (tasks) e clique com o botão direito do mouse no item e selecione 'Novo Alerta'.
Quando entramos na criação do novo alerta a primeira aba exibida é a 'Geral'. Nesta aba damos um nome para o alerta, para que quando for emitido os operadores do servidor saibam o que ocorreu, quando e em que situação ele deve ser disparado.
Na caixa 'Nome' digite um nome para o alerta. O importante é destacar este alerta dos demais bem como facilitar a identificação do alerta no servidor SQL.
Quanto ao ‘tipo do alerta’ ele pode ser:
1-Alerta de evento do SQL Server
2-Alerta de condição de desempenho do SQL Server
3-Alerta de Evento WMI.
Todos eles são associados a mensagens.
Esse tipo de alerta define onde o alerta deverá atuar,
1-No banco de dados,
2-Sobre o desempenho no servidor ou
3-Sobre o gerenciamento de recursos do servidor (WMI).
Este é o alerta mais comum e é disparado quando um evento específico ocorre no servidor sql. Para descobrir os eventos que podem disparar o alerta faça a pesquisa a seguir:
No campo ‘Definição de alerta de evento’ temos os seguintes parâmetros:
1.1-Nome do banco de dados.
Podemos escolher um banco de dados específico ou todos os bancos de dados do servidor.
1.2-No campo ‘Os alertas serão gerados com base em’ definimos se o alerta deve ser disparado pelo código de erro emitido pelo SQL Server ou pela severidade do erro ocorrido.
1.2.1-Selecionando pelo número do erro.
Ao clicar no item de seleção ‘Número do erro’ o box de número fica habilitado para ser digitado pelo usuário.
Os alertas por 'evento' são emitidos quando a mensagem é emitida. Toda mensagem emitida pelo SQL
server tem :
1-Um número (message_id),
2-Um idioma (language_id),
3-uma severidade (severity),
4-Um texto.
O item 1, número do erro é o número da mensagem emitida pelo servidor SQL.
O item 2 é o idioma da mensagem. Mudando esse número temos a mesma mensagem emitida em outro idioma. A mensagem em si
não muda.
O item 3 é a severidade. De 0 a 15 são reservadas ao Servidor SQL e 0 é a mais grave e 15 a mais amena, praticamente
uma mensagem de informação. Note que a ocorrência de um erro mesmo que grave não obrigatoriamente para o funcionamento
do servidor SQL, mas, normalmente, exige alguma manutenção.
O item 4 texto é uma mensagem personalizada que você deseja incorporar a mensagem do SQL Server. Podemos customizar a
mensagem por banco de dados ou a ocorrência dela sendo diferente de um banco de dados para outro pode requerer um nível
diferente de atenção e neste campo texto podemos informar uma particularidade sobre esse nível de atenção.
Vamos para os finalmente...Colocando a informações no alerta na aba ''Geral'':
Agora vamos para a aba 'Resposta' do Alerta. Esta aba define o que o alerta deverá fazer.
Note que temos o item ‘Executar trabalho’ que poderá executar algum trabalho para corrigir o problema. O trabalho é uma task que poderá contornar ou corrigir o problema. Você poderá criar a task clicando no botão 'Novo trabalho' ou clicar em 'Exibir trabalho' para escolher uma task já existente que será executada quando o alerta for emitido.
Selecionando a aba ‘opções’ podemos selecionar a opção 'Enviar Email' e incluir a mensagem do SQL Server no email que desejamos enviar.
Sendo assim sempre que o servidor emitir a mensagem 9002-Log Full esse alerta será emitido e o que você associou alguma task para esse evento ela será executada.
Importante : O SQL Server é dependente do SQL Server Agent para fazer a emissão do alerta, do email entre outros. Portanto esteja certo que o serviço MS SQL Agent esteja em execução para tudo funcionar perfeitamente.