سؤال

كتبت الزناد الذي يقوم بتحديث الطاولة المحلية وجدول مماثل على خادم مرتبط.

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، يوفر الموثوقية في حالة الحوادث (أحد الخوادم غير متاح) وستنتشر التحديثات الخاصة بك في الوقت الفعلي (بمجرد ارتكابها). يحتوي موقعي على العديد من الأمثلة على كيفية القيام بذلك، يمكنك البدء في هذه المقالة هنا كيفية تحقيق سرعة الإنتاجية.

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