Como executar o rastreamento do criador de perfil SQL quando um problema precisa ser detectado das 3:00 às 3:30 da manhã? Isso pode ser feito usando um rastreamento do lado do servidor, mas isso é extremamente inconveniente. Não é difícil, mas desconfortável e sempre preguiçoso. Finalmente, decidi automatizar isso de uma vez por todas. Assim:

Jenkins aqui, a propósito, é completamente opcional e serve apenas como uma interface para chamar um script com os parâmetros necessários:

Mostrarei a solução em detalhes, de qualquer maneira, existem muitas especificidades relacionadas especificamente à nossa infraestrutura. Ou seja, farei o que é mostrado à esquerda:

Portanto, o arquivo bat faz alguma coisa e transfere a ação já para o script do PowerShell, para o qual passa todos os parâmetros e mais duas variáveis - '% BUILD_USER_ID%', '% BUILD_USER_EMAIL%' - recebidas da Jenkins. Eles serão úteis para nós mais tarde:

Curiosamente, pouco é realmente valioso no próprio ps1: um certo procedimento é chamado lá, o qual, pelo nome do servidor, cria e retorna o nome do diretório em um compartilhamento especial onde esse arquivo será colocado. O servidor em que esse diretório será criado depende do datacenter em que o servidor está localizado no qual o rastreamento será iniciado. Além disso, o usuário tem o direito de ler o rastreamento, e há um processo que limpa esses diretórios em alguns dias. Como você pode ver, você pode não precisar disso e pode pular tudo isso com segurança.
Agora a ação já está transferida para o servidor em que o rastreamento será iniciado, no arquivo SQL. loc é apenas um parâmetro que contém o caminho em que o rastreamento final será copiado. Você pode substituí-lo por uma constante.

Primeiro, precisamos encontrar um local onde escreveremos o arquivo de rastreamento localmente. Por exemplo, assim:

Em seguida, um pouco de limpeza. De repente, esse arquivo já existe ou alguém executou o rastreamento anteriormente? Você precisará executar o sys.traces e parar / excluir a gravação do rastreamento em% jenkinsTraceSch%, se já houver um. Em seguida, crie um rastreio (limite seu tamanho!) E um pouco de tédio com as chamadas sp_trace_setevent. Você pode facilitar sua vida fazendo CROSS JOIN entre eventos e colunas:

Agora adicione filtros a gosto. Aqui, apenas você termina sua coruja. Este é o primeiro local em que usamos parâmetros de script - tipo de filtro e nome do banco de dados:

Agora o thrash foi:

Em @j, você forma um comando para Job, que será:
- Aguarde a hora certa com WAITFOR
- Corra a pista
- Aguarde o tempo solicitado
- Pare a corrida
- Aguarde mais um segundo para o caso - operações assíncronas
- Forme uma equipe para copiar o rastreamento no lugar certo
- Realize-a
- Formulário Assunto e corpo
- Envie uma carta ao cliente através de sp_send_dbmail com um link para o rastreio
Agora precisamos criar um trabalho com o passo 1 descrito em @j. No entanto, ainda adiciono suicídio a este trabalho, para que Joba desapareça sem deixar rasto no final do trabalho:

Aqui ouço gritos sobre xp_cmdshell ... Não quero comentar sobre isso. No final, ninguém deve testemunhar contra si mesmo no tribunal. Mas você pode fazer o contrário. É improvável que você consiga enviar o rastreamento por correio - é grande. Embora você possa embalá-lo. Bem, deixe-o no próprio servidor e deixe o usuário buscá-lo por conta própria ou puxe-o via UNC para um local acessível ao usuário
Então você tem:
- Jenkins chama morcego
- bat chama powershell
- O powershell chama o script SQL por meio do sqlcmd
- O script cria Job
- Job cria um rastreio e envia e-mail antes do suicídio:
Eu nunca teria pensado que uma cadeia tão longa funcionaria. Mas funciona ...

PS: E sim, mesmo que xp_cmdshell seja proibido e você não possa ativá-lo, você tem pelo menos duas maneiras de escrever my_xp_cmdshell. Portanto, essa "proteção" não protege contra nada.