كيف يمكن أن لا يكون لديك Sql Server 2005 بشكل غير متزامن استدعاء ملف دفعي DOS من DDL الزناد ؟

StackOverflow https://stackoverflow.com/questions/802398

سؤال

أنا إنشاء ملف دفعي إلى تشغيل SqlMetal وتوليد Linq2Sql البيانات الطبقات تحقق في مصدر عنصر التحكم اثار بناء ، الخ...أود أن يكون هذا البرنامج النصي تشغيل في أي وقت هناك DDL تغيير في Sql Server 2005.

تشغيل ملف دفعي عن طريق xp_cmdshell يعمل بشكل جيد خارج الزناد, مثل هذا:

exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

ولكن عندما يعمل على الزناد دائما مرات الاتصال إلى قاعدة البيانات ، مما تسبب في كل DDL أن تفشل.هنا هو بلدي الزناد:

CREATE TRIGGER [Trig_SqlMetal]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

أنا أبحث عن المشورة بشأن نقطتين:

  1. جعل هذا العمل.لسبب ما دائما عندما يفشل في الزناد ، و لا في الزناد.لا يبدو أن الأمن ذات الصلة منذ تشغيله LocalSystem في كلتا الحالتين.
  2. جعل هذا يحدث asychronously بحيث الفشل مهلة في SqlMetal لا يسبب DDL فشل التحديث.لقد حاولت يلف ملف دفعي آخر و "بداية cmd.exe /ج otherbatch.الخفافيش" ، ولكن عند تشغيل من خلال sql server يبدو أن تجاهل بداية (يعمل بشكل جيد من DOS).أنا بالتأكيد يمكن كتابة عملية الاقتراع للنظر في بعض طاولة صغيرة الأحداث, ولكن أنا أفضل أن يكون هذا يؤدي إلى جعلها أقل تعقيدا (أو أفعل العكس :) ).
هل كانت مفيدة؟

المحلول

دفعة الخاص بك هو على الارجح يتم حظره لأنه يحاول بيانات الاستعلام عن الجداول التي يتم إنشاؤها ، لكنها لا تزال تخوض داخل الصفقة (على الزناد هو جزء من الصفقة الضمنية بدء تشغيل SQL Server لأي DDL/DML البيان) ، التي من شأنها كاملة إلا بعد الزناد التشطيبات.الوحيد "تقريبا" طريقة عملية التنفيذ المتزامن في SQL Server 2005 أو أعلى أن أعرف من هو وسيط الخدمة.ابحث عن "وسيط الخدمة الداخلية التنشيط".في واقع الامر معقد بعض الشيء إلى إعداده بشكل صحيح ، لذلك قد تختار أن تذهب لتجميع الخيار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top