كيفية تشغيل تتبع محلل SQL عندما تحتاج إلى اكتشاف مشكلة من 3:00 إلى 3:30 في الصباح؟ يمكن القيام بذلك باستخدام التتبع من جانب الخادم ، ولكن هذا غير مريح للغاية. إنه ليس صعبًا ، ولكنه غير مريح ، وكسول دائمًا. أخيرا ، قررت أتمتة هذا مرة وإلى الأبد. مثل هذا:

Jenkins هنا ، بالمناسبة ، اختياري تمامًا ويعمل فقط كواجهة لاستدعاء برنامج نصي بالمعلمات الضرورية:

سأعرض الحل بضربات كبيرة ، على أي حال هناك الكثير من التفاصيل المتعلقة على وجه التحديد ببنيتنا التحتية. أي أنني سأفعل ما يظهر على اليسار:

لذلك ، يقوم ملف bat بعمل شيء ما وينقل الإجراء بالفعل إلى برنامج PowerShell النصي ، والذي يمرر إليه جميع المعلمات ومتغيرين آخرين - '٪ BUILD_USER_ID٪' ، '٪ BUILD_USER_EMAIL٪' - تم استلامهما من Jenkins. ستكون مفيدة لنا لاحقًا:

من الغريب أن يحدث القليل حقًا حقًا في ps1 نفسها: يتم استدعاء إجراء معين هناك ، والذي ينشئ ويعيد اسم الدليل على مشاركة خاصة بواسطة اسم الخادم حيث سيتم وضع هذا الملف. يعتمد الخادم حيث سيتم إنشاء هذا الدليل على مركز البيانات حيث يوجد الخادم الذي سيتم تشغيل التتبع عليه. بالإضافة إلى ذلك ، يُمنح المستخدم حق قراءة التتبع ، وهناك عملية تنظف هذه الأدلة في غضون يومين. كما ترى ، قد لا تحتاج إلى هذا ويمكنك تخطي كل هذا بأمان.
الآن يتم نقل الإجراء بالفعل إلى الخادم حيث سيتم تشغيل التتبع ، في ملف SQL. loc هي مجرد معلمة تحتوي على المسار حيث سيتم نسخ التتبع النهائي. يمكنك استبداله بثابت.

نحتاج أولاً إلى العثور على مكان سنكتب فيه ملف التتبع محليًا. على سبيل المثال ، مثل هذا:

بعد ذلك ، القليل من التنظيف. فجأة يوجد مثل هذا الملف بالفعل ، أو هل قام شخص ما بتشغيل التتبع في وقت سابق؟ ستحتاج إلى إنهاء sys.traces وإيقاف / حذف كتابة التتبع في٪ jenkinsTraceSch٪ ، إن وجدت. بعد ذلك ، قم بإنشاء تتبع (حد حجمه!) وقليل من التعب مع مكالمات sp_trace_setevent. يمكنك أن تجعل حياتك أسهل من خلال جعل CROSS JOIN بين الأحداث والأعمدة:

الآن أضف الفلاتر حسب الذوق. هنا ، فقط أنهيت البومة الخاصة بك. هذا هو المكان الأول حيث نستخدم معلمات البرنامج النصي - نوع الفلتر واسم قاعدة البيانات:

الآن ذهب التهيج:

فيj ، يمكنك تشكيل أمر لـ Job ، والذي سيكون:
- انتظر الوقت المناسب مع WAITFOR
- قم بتشغيل المسار
- انتظر الوقت المطلوب
- توقف عن السباق
- انتظر ثانية أخرى فقط في حالة - العمليات غير المتزامنة
- قم بتشكيل فريق لنسخ التتبع إلى المكان الصحيح
- أخرجها
- موضوع النموذج ورسائل النص
- إرسال بريد إلكتروني إلى العميل من خلال sp_send_dbmail مع رابط للتتبع
نحتاج الآن إلى إنشاء Job مع الخطوة 1 الموضحة فيj. ومع ذلك ، ما زلت أضيف الانتحار إلى هذه الوظيفة حتى يختفي جوبا دون أن يترك أثراً في نهاية العمل:

هنا أسمع صرخات حول xp_cmdshell ... لا أريد التعليق على ذلك. في النهاية ، لا ينبغي لأحد أن يشهد ضد نفسه في المحكمة. لكن يمكنك فعل خلاف ذلك. من غير المحتمل أن تتمكن من إرسال التتبع بالبريد - فهو كبير. على الرغم من أنه يمكنك حزمه. حسنًا ، إما تركه على الخادم نفسه والسماح للمستخدم بالتقاطه من تلقاء نفسه أو سحبه عبر UNC إلى مكان يمكن للمستخدم الوصول إليه
إذن لديك:
- جينكينز يدعو الخفافيش
- يدعو الخفافيش بوويرشيل
- يدعو powershell SQL النصي من خلال sqlcmd
- يقوم البرنامج النصي بإنشاء Job
- يخلق الوظيفة أثرًا ويرسل البريد قبل الانتحار:
لم أكن لأفكر أبدًا في أن مثل هذه السلسلة الطويلة ستنجح. لكنها تعمل ...

ملاحظة: نعم ، حتى إذا كان xp_cmdshell ممنوعًا ولا يمكنك تمكينه ، فلديك طريقتان على الأقل لكتابة my_xp_cmdshell. لذا فإن هذه "الحماية" لا تحمي من أي شيء.