الأعراض
افترض ان لديك اجراء مخزن في SQL للعمليات ، مثل التالي الذي ياخذ معلمه ذات قيمه جدول (TVP) التي تحتوي علي القيد كوسيطه:
create type TestTvpType as table
(
id int primary key, -- UNIQUE will also do the trick
data int
);
go
create procedure TestTvpProc @tvp TestTvpType readonly
as
begin
select * from @tvp;
end;
go
بالنسبة إلى السيناريو الذي يتم فيه استدعاء هذا الاجراء من اجراء مخزن سقلكلر وتم انتهاك القيد للوسيطة ، قد تتلقي بشكل غير صحيح تاكيد النظام ، وذلك عندما تتوقع تلقي رسالة الخطا "خرق القيد".
فيما يلي مثال لاجراء سقلكلر ينتج انتهاك قيد للاجراء المخزن:
[SqlProcedure]
public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
sum = 0;
DataTable myDataTable = new DataTable("TestTvpType");
myDataTable.Columns.Add("id", typeof(Int32));
myDataTable.Columns.Add("data", typeof(Int32));
// Populate the TVP so it will trigger a PRIMARY KEY VIOLATION error
myDataTable.Rows.Add(1, 1000);
myDataTable.Rows.Add(1, 2000);
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@tvp";
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.Value = myDataTable;
SqlCommand command = new SqlCommand("TestTvpProc", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(parameter);
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
…;
}
}
}
}
الحل
تم تصحيح هذه المشكلة في التحديثات التراكمية التالية ل SQL Server:
تحديث تراكمي 5 ل SQL Server 2016 RTM
تحديث تراكمي 2 ل SQL Server 2016 SP1
تحديث تراكمي 4 ل SQL Server 2014 Service Pack 2
ملاحظه يؤدي هذا التحديث إلى ظهور رسالة الخطا "مخالفه القيد" الصحيحة.
يتضمن كل تحديث تراكمي جديد ل SQL Server كل الإصلاحات العاجلة وتصحيحات الأمان التي تم تضمينها في التحديث التراكمي السابق. اطلع علي آخر التحديثات التراكمية ل SQL Server:
الحالة
أقرت Microsoft أن هذه المشكلة تحدث في منتجات Microsoft المسردة في المقطع "تنطبق على".
المراجع
تعرف علي المصطلحات التي تستخدمها Microsoft لوصف تحديثات البرامج.