Bagaimana menjalankan jejak profiler SQL ketika masalah perlu ditangkap dari jam 3:00 sampai 3:30 pagi? Ini dapat dilakukan menggunakan jejak sisi server, tetapi ini sangat merepotkan. Itu tidak sulit, tetapi tidak nyaman, dan selalu malas. Akhirnya, saya memutuskan untuk mengotomatisasi ini sekali dan untuk semua. Seperti ini:

Jenkins di sini, omong-omong, sepenuhnya opsional dan hanya berfungsi sebagai antarmuka untuk memanggil skrip dengan parameter yang diperlukan:

Saya akan menunjukkan solusinya dengan pukulan besar, toh ada banyak hal spesifik terkait dengan infrastruktur kami. Yaitu, saya akan melakukan apa yang diperlihatkan di sebelah kiri:

Jadi, file bat melakukan sesuatu dan mentransfer tindakan sudah ke skrip PowerShell, yang melewati semua parameter dan dua variabel lainnya - '% BUILD_USER_ID%', '% BUILD_USER_EMAIL%' - diterima dari Jenkins. Mereka akan berguna bagi kita nanti:

Anehnya, sedikit yang benar-benar bernilai terjadi pada ps1 itu sendiri: prosedur tertentu dipanggil di sana, yang membuat dan mengembalikan nama direktori pada pembagian khusus dengan nama server tempat file ini akan diletakkan. Server tempat direktori ini akan dibuat tergantung pada pusat data di mana server berada di mana jejak akan diluncurkan. Selain itu, pengguna diberikan hak untuk membaca jejak, dan ada proses yang membersihkan direktori ini dalam beberapa hari. Seperti yang Anda lihat, Anda mungkin tidak membutuhkan ini dan Anda dapat melewati semua ini dengan aman.
Sekarang tindakan sudah ditransfer ke server tempat pelacakan akan diluncurkan, dalam file SQL. loc hanyalah parameter yang berisi jalur tempat jejak yang sudah selesai akan disalin. Anda dapat menggantinya dengan konstanta.

Pertama kita perlu menemukan tempat di mana kita akan menulis file jejak secara lokal. Misalnya, seperti ini:

Selanjutnya, sedikit pembersihan. Tiba-tiba file seperti itu sudah ada, atau apakah seseorang menjalankan jejak sebelumnya? Anda perlu menjalankan sys.traces dan menghentikan / menghapus jejak penulisan di% jenkinsTraceSch%, jika sudah ada. Selanjutnya, buat jejak (batasi ukurannya!) Dan sedikit kebosanan dengan panggilan sp_trace_setevent. Anda dapat membuat hidup Anda lebih mudah dengan membuat CROSS JOIN antara berbagai peristiwa dan kolom:

Sekarang tambahkan filter secukupnya. Di sini, baru saja kamu menyelesaikan burung hantu. Ini adalah tempat pertama di mana kami menggunakan parameter skrip - tipe filter dan nama database:

Sekarang thrash pergi:

Di @j Anda membentuk perintah untuk Ayub, yang akan menjadi:
- Tunggu waktu yang tepat dengan WAITFOR
- Jalankan trek
- Tunggu waktu yang dipesan
- Hentikan balapan
- Tunggu sebentar lagi untuk berjaga-jaga - operasi asinkron
- Bentuk tim untuk menyalin jejak ke tempat yang tepat
- Bawa dia keluar
- Formulir Subjek dan huruf tubuh
- Kirim surat ke pelanggan melalui sp_send_dbmail dengan tautan ke jejak
Sekarang kita perlu membuat Job dengan langkah 1 yang dijelaskan dalam @j. Namun, saya masih menambahkan bunuh diri pada Ayub ini sehingga Joba menghilang tanpa jejak di akhir pekerjaan:

Di sini saya mendengar teriakan tentang xp_cmdshell ... Saya tidak ingin mengomentari ini. Pada akhirnya, tidak ada yang harus bersaksi melawan dirinya sendiri di pengadilan. Tetapi Anda bisa melakukan sebaliknya. Kecil kemungkinan Anda akan dapat mengirim jejak melalui pos - ini besar. Meskipun Anda bisa mengemasnya. Baik, tinggalkan saja di server itu sendiri dan izinkan pengguna untuk mengambilnya sendiri atau menariknya melalui UNC ke tempat yang dapat diakses oleh pengguna.
Jadi kamu punya:
- Jenkins menyebut kelelawar
- kelelawar memanggil PowerShell
- Powershell memanggil skrip SQL melalui sqlcmd
- Script menciptakan Ayub
- Pekerjaan menciptakan jejak dan mengirim surat sebelum bunuh diri:
Saya tidak akan pernah berpikir bahwa rantai panjang seperti itu akan berhasil. Tapi berhasil ...

PS: Dan ya, bahkan jika xp_cmdshell dilarang dan Anda tidak dapat mengaktifkannya, Anda memiliki setidaknya 2 cara untuk menulis my_xp_cmdshell. Jadi "perlindungan" ini tidak melindungi terhadap apa pun.