FIX: جملة MERGE قد لا فرض قيد مفتاح خارجي عند تحديث العبارة عمود مفتاح فريد ليس جزءاً من مفتاح نظام المجموعة وهناك صف واحد كمصدر تحديث في SQL Server 2008

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

اضغط هنا لرابط المقالة باللغة الانجليزية956718
الخطأ رقم: 50003167 (الإصلاح العاجل SQL)
لمزيد من المعلومات حول قائمة رئيسية وبالطريقة التي تم إصدارها بعد إصدار SQL انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
957826حيث يمكنك العثور على مزيد من المعلومات حول SQL Server 2008 بناء التي تم إصدارها بعد SQL Server 2008 و بناء SQL Server 2005 التي تم إصدارها بعد SQL Server 2005 المزود بحزمة الخدمة SP2
الأعراض
في Microsoft SQL Server 2008 قيد مفتاح خارجي قد لا يتم فرض عند الشروط التالية:
  • يتم إصدار جملة MERGE.
  • يتضمن عمود الهدف التحديث nonclustered فهرس فريد.
اطلع على السيناريو التالي. تحديث العبارة فريداً للعمود الذي يسمى Column1 جدول يسمى Table1. تتم الإشارة Table1 قيد مفتاح خارجي من جدول المسمى Table2.

تكون النتيجة تغيير الصفوف في Table1 عند يجب أن لا نحو. بالإضافة إلى ذلك، سيكون Table2 الصفوف التي تحتوي على مراجع dangling Table1.

تحدث هذه المشكلة عن هذا السيناريو الشروط التالية:
  • عمود Column1 المشار إليه في Table1 ليس جزءاً من مفتاح نظام المجموعة Table1.
  • يمكن تعيين قيمة ممكنة واحدة فقط إلى العمود Column1. على سبيل المثال، أحد السيناريوهات التالية يحدث:
    • مصدر دمج صف واحد من البيانات. على سبيل المثال، مصدر دمج من إحدى العبارات حدد التالية:
      • select <ConstantValues>
      • select <Parameters>
      ملاحظة يعد هذا السيناريو السيناريو الأكثر ملاءمة.
    • مصدر دمج صف واحد من البيانات فعلياً. على سبيل المثال، مصدر دمج من إحدى العبارات حدد التالية:
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        ملاحظة<TableName>. <ColumnName> معروف بواسطة للمحسن الاستعلام أن تكون قيمة فريدة.
      • select top 1 <ColumnName> from <TableName>
    • صلة بين مصدر دمج والهدف دمج تحتوي دالة تقييم يضمن سيتم تحديث صف واحد.
    • تعيين جملة تحديث العمود Column1 قيمة ثابتة بغض النظر عن مصدر دمج.
  • لم يتم تمكين الخيار تشغيل تتالي تحديث على قيد المفتاح الخارجي في Table2.
ملاحظة نوصي بتطبيق هذا الإصلاح العاجل إذا كنت تستخدم جملة MERGE لتحديث الأعمدة التي لها nonclustered الفهارس الفريدة التي يتم الرجوع إليها بواسطة قيود المفاتيح الخارجية.
الحل
تم إصدار الإصلاح الخاص بهذه المشكلة أولاً في التحديث التراكمي 1. لمزيد من المعلومات حول كيفية الحصول على حزمة التحديث التراكمي هذه لـ SQL Server 2008 انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
956717حزمة التحديث التراكمي 1 لـ SQL Server 2008
ملاحظة لأن وبالطريقة تراكمية، يتضمن كل إصدار إصلاح جديد كافة الإصلاحات العاجلة وأصلح كافة تصحيحات الأمان التي تم تضمينها مع SQL Server 2008 السابقة الإصدار. ونحن ننصح بالتفكير تطبيق أحدث إصدار الإصلاح الذي يحتوي على هذا الإصلاح العاجل. لمزيد من المعلومات، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
956909بناء SQL Server 2008 التي تم إصدارها بعد إصدار SQL Server 2008
الحل البديل
حزمة الإصلاح العاجل بحل المشكلة. حالة استخدام جملة MERGE في السيناريو الموضحة في قسم "الأعراض" وفي حالة عدم اختيار تطبيق الإصلاح العاجل اتبع الخطوات التالية لحل هذه المشكلة:
  1. إعادة كتابة جملة MERGE بحيث تكون قيم مصدر دمج في الجدول أو الجدول المؤقت متغير الجدول بدلاً من الآن في- مسطرة في الاستعلام.
  2. استخدم العلامة التتبع 8790. تفرض هذه العلامة التتبع للمحسن نوع من الخطة التي تسمى خطة تحديث واسع. لم يكن خطط التحديث واسع المشكلة. هذه الخطوة تحمل المخاطر الأداء للحصول على كافة العبارات DML. لذلك، يجب تجنب استخدام هذه الخطوة إلا إذا كانت مستحيلة لتغيير التطبيق.
يظهر البرنامج النصي Transact-SQL التالي طريقة واحدة لتغيير البرنامج النصي الخاص بك لحل هذه المشكلة إذا كان لا يمكنك تطبيق هذا الإصلاح العاجل.

على سبيل المثال، لديك برنامج نصي مشابهة لما يلي:
use tempdb;drop table sale, product;create table product(pno int not null primary key, name char(30), pAlternateKey char(6) not null unique);create table sale(sno int not null primary key, pAlternateKey char(6) not null references product(pAlternateKey));insert product values(1, 'Office Chair', 'ochair');insert sale values(1, 'ochair')-- No violation of foreign key constraint is detected. However, one should be.merge into productusing (select 'Office Chair2' as name, 1 as pno, 'oxx' as pAlternateKey) as srcon product.pno = src.pnowhen matched then   update set product.pAlternateKey = src.pAlternateKey,               product.name = src.namewhen not matched then   insert values(src.pno, src.name, src.pAlternateKey);
تغيير البرنامج النصي بحيث أنه لما يلي:
insert product values(1, 'Office Chair', 'ochair');insert sale values(1, 'ochair')-- A foreign key constraint violation is detected, and the update fails.declare @source table    (name nchar(30), pno int, pAlternateKey nchar(30));insert into @source values('Office Chair2',1,'oxx');merge into productusing @source as srcon product.pno = src.pnowhen matched then   update set product.pAlternateKey = src.pAlternateKey,               product.name = src.namewhen not matched then   insert values(src.pno, src.name, src.pAlternateKey);
تصريح
أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في قسم "تنطبق على".
معلومات أخرى
للحصول على مزيد من المعلومات حول تغيير ما هي الملفات و للحصول على معلومات حول أية متطلبات مسبقة لتطبيق حزمة التحديث التراكمي الذي يحتوي على الإصلاح الجديد الموضح في مقالة "قاعدة المعارف لـ Microsoft" هذه انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
956717حزمة التحديث التراكمي 1 لـ SQL Server 2008
مراجع
للحصول على مزيد من المعلومات حول القائمة وبالطريقة التي تتوفر بعد إصدار SQL Server 2008 انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
956909بناء SQL Server 2008 التي تم إصدارها بعد إصدار SQL Server 2008


لمزيد من المعلومات حول "نموذج تقديم تزايدي" لـ SQL Server انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
935897يتوفر "نموذج تقديم تزايدي" من فريق SQL Server لتسليم الإصلاحات العاجلة لمشكلات تم الإبلاغ عنها


لمزيد من المعلومات حول مخطط التسمية لتحديثات SQL Server "، انقر فوق رقم المقالة التالي لعرضها في" قاعدة المعارف لـ Microsoft:
822499مخطط تسمية جديدة حزم تحديثات برامج Microsoft SQL Server


لمزيد من المعلومات حول مصطلحات تحديث البرامج "، انقر فوق رقم المقالة التالي لعرضها في" قاعدة المعارف لـ Microsoft:
824684وصف للمصطلحات القياسية المستخدمة في وصف تحديثات برامج Microsoft
مراجع
لمزيد من المعلومات حول الفهارس nonclustered في SQL Server 2008 قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
"تثبيت SQL Server 2008" "تكوين SQL Server 2008"

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 956718 - آخر مراجعة: 09/19/2008 20:41:00 - المراجعة: 4.0

Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Standard Edition for Small Business, Microsoft SQL Server 2008 Web, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 Express, Microsoft SQL Server 2008 Express with Advanced Services

  • kbmt kbautohotfix kbhotfixserver kbqfe kbpubtypekc kbfix KB956718 KbMtar
تعليقات