¿Cómo ejecutar el rastreo del generador de perfiles SQL cuando se necesita detectar un problema de 3:00 a 3:30 de la mañana? Esto se puede hacer usando un rastreo del lado del servidor, pero esto es extremadamente inconveniente. No es difícil, pero incómodo, y siempre vago. Finalmente, decidí automatizar esto de una vez por todas. Así:

Jenkins aquí, por cierto, es completamente opcional y sirve solo como una interfaz para invocar un script con los parámetros necesarios:

Mostraré la solución en grandes trazos, de todos modos hay muchos detalles relacionados específicamente con nuestra infraestructura. Es decir, haré lo que se muestra a la izquierda:

Entonces, el archivo bat hace algo y transfiere la acción al script de PowerShell al que pasa todos los parámetros y dos variables más - '% BUILD_USER_ID%', '% BUILD_USER_EMAIL%' - recibidas de Jenkins. Nos serán útiles más tarde:

Por extraño que parezca, en ps1 sucede muy poco realmente valioso: allí se llama a un cierto procedimiento, que crea y devuelve el nombre del directorio en un recurso compartido especial por el nombre del servidor donde se colocará este archivo. El servidor donde se creará este directorio depende del centro de datos donde se encuentra el servidor en el que se iniciará el rastreo. Además, se le otorga al usuario el derecho de leer el seguimiento, y hay un proceso que limpia estos directorios en un par de días. Como puede ver, es posible que no necesite esto y puede omitir todo esto de manera segura.
Ahora la acción ya se transfiere al servidor donde se iniciará el rastreo, en el archivo SQL. loc es solo un parámetro que contiene la ruta donde se copiará la traza finalizada. Puedes reemplazarlo con una constante.

Primero necesitamos encontrar un lugar donde escribiremos el archivo de rastreo localmente. Por ejemplo, así:

A continuación, un poco de limpieza. De repente, tal archivo ya existe, ¿o alguien ejecutó el rastreo antes? Necesitará ejecutar sys.traces y detener / eliminar la escritura de rastreo en% jenkinsTraceSch%, si ya hay una. A continuación, cree una traza (¡limite su tamaño!) Y un poco de tedio con las llamadas sp_trace_setevent. Puede hacer su vida más fácil haciendo CROSS JOIN entre eventos y columnas:

Ahora agregue filtros al gusto. Aquí, solo terminas tu búho. Este es el primer lugar donde usamos parámetros de script: tipo de filtro y nombre de la base de datos:

Ahora el golpe fue:

En @j usted forma un comando para Job, que será:
- Espera el momento adecuado con WAITFOR
- Corre la pista
- Espera la hora ordenada
- Detener la carrera
- Espere otro segundo por si acaso: operaciones asincrónicas
- Forme un equipo para copiar la traza en el lugar correcto
- Llevarla a cabo
- Forma Asunto y cuerpo de cartas
- Envíe una carta al cliente a través de sp_send_dbmail con un enlace a la traza
Ahora necesitamos crear Job con el paso 1 descrito en @j. Sin embargo, todavía agrego suicidio a este trabajo para que Joba desaparezca sin dejar rastro al final del trabajo:

Aquí escucho gritos sobre xp_cmdshell ... No quiero comentar sobre esto. Al final, nadie debe testificar contra sí mismo en la corte. Pero puedes hacer lo contrario. Es poco probable que pueda enviar el seguimiento por correo, es grande. Aunque puedes empacarlo. Bueno, déjelo en el servidor y permita que el usuario lo recoja por su cuenta o llévelo a través de UNC a un lugar accesible para el usuario
Entonces tienes:
- Jenkins llama murciélago
- bat llama powershell
- powershell llama a un script SQL a través de sqlcmd
- El script crea Job
- Job crea un rastro y envía un correo antes del suicidio:
Nunca hubiera pensado que una cadena tan larga funcionaría. Pero funciona ...

PD: Y sí, incluso si xp_cmdshell está prohibido y no puede habilitarlo, tiene al menos 2 formas de escribir my_xp_cmdshell. Entonces esta "protección" no protege contra nada.