اختبار الخادم المرتبط conccetion داخل الزناد أو الإجراء
-
06-09-2019 - |
سؤال
كتبت الزناد الذي يقوم بتحديث الطاولة المحلية وجدول مماثل على خادم مرتبط.
CREATE TRIGGER myTtableUpdate ON myTable
AFTER UPDATE
AS
IF (COLUMNS_UPDATED() > 0)
BEGIN
DECLARE @retval int;
BEGIN TRY
EXEC @retval = sys.sp_testlinkedserver N'my_linked_server';
END TRY
BEGIN CATCH
SET @retval = sign(@@error);
END CATCH;
IF (@retval = 0)
BEGIN
UPDATE remoteTable SET remoteTable.datafield = i.datafield
FROM my_linked_server.remote_database.dbo.myTable remoteTable
INNER JOIN inserted i ON (remoteTable.id = i.id)
END
END -- end of trigger
لسوء الحظ عندما يكون الاتصال معطلا، أحصل على رسالة خطأ
"MSG 3616، المستوى 16، الدولة 1، السطر 2"
معاملة محكوم عليها في الزناد. تم إحباط دفعة "
ويتم التراجع عن التحديث المحلي.
هل هناك طريقة للحفاظ على هذا الخطأ والحفاظ على التحديثات المحلية؟
لاحظ أن أنا أستخدم SQL Server 2005 Express Edition على كلا PCS قيد التشغيل Windows XP Pro.
Edit1: SQL Server هو Express Edition
Edit2: كلا PCS قم بتشغيل Windows XP Pro بحيث تكون هذه الخوادم
المحلول
لا تكتب إلى الخادم البعيد في الزناد.
- قم بإنشاء جدول محلي لتخزين الصفوف التي تحتاج إلى دفع إلى الخادم البعيد
- إدراج في هذا الجدول المحلي الجديد في الزناد
- قم بإنشاء وظيفة يتم تشغيلها كل دقيقة في الدقائق الناردة من هذا الجدول المحلي إلى الخادم البعيد.
يمكن لهذه المهمة تشغيل إجراء يمكنه اختبار الاتصال، وعندما يتم نسخها احتياطيا، ستعالج جميع الصفوف في الجدول المحلي الجديد. يمكن أن تعالج الصفوف في الجدول المحلي بهذه الطريقة:
declare @OutputTable table (RowID int not null)
insert into my_linked_server.remote_database.dbo.myTable remoteTable(...columns...)
OUTPUT INSERTED.RowID
INTO @OutputTable
SELECT ...columns...
from NewLocalTable
delete NewLocalTable
from NewLocalTable n
inner join @OutputTable o ON n.RowID=o.RowID
تحرير تعليق OP
بعد إدخال هذا الجدول المحلي الجديد، ابدأ تشغيل المهمة من الزناد (sp_start_job)، وسيتم تشغيلها في نطاقها الخاص. إذا لم تتمكن من استخدام وظائف SQL Server، فاستخدم XP_CMDSHELL لتنفيذ الإجراء المخزن (Lookup SQLCMD أو ISQL أو OSQL، لست متأكدا من ما لديك). لا تزال جدولة الوظيفة كل دقيقة، لذلك سيتم تشغيله في النهاية عندما يأتي الاتصال.
نصائح أخرى
هو واحد على الأقل من خوادم مجموعة عمل مجموعة أو أعلى؟ يمكنك استخدام وسيط الخدمات لشحن سجلاتك بدلا من الخوادم المرتبطة، لكنها لن تعمل بين التعبير عن الإصدارات بسبب قيود الترخيص. هو الحل الذي يعتمد حصريا على SQL، يوفر الموثوقية في حالة الحوادث (أحد الخوادم غير متاح) وستنتشر التحديثات الخاصة بك في الوقت الفعلي (بمجرد ارتكابها). يحتوي موقعي على العديد من الأمثلة على كيفية القيام بذلك، يمكنك البدء في هذه المقالة هنا كيفية تحقيق سرعة الإنتاجية.