Požymiai
Tarkime, kad turite "Transact-SQL" išsaugotą procedūrą, tokią, kaip toliau pateikta, kuri kaip argumentą naudoja lentelės reikšmių parametrą (TVP), turintį apribojimą:
create type TestTvpType as table
(
id int pirminis raktas, -- UNIQUE taip pat padarys triuką
data int
);
grįžti
create procedure TestTvpProc TestTvpType @tvp tik skaityti
kaip
pradėti
select * from @tvp;
pabaiga;
grįžti
Kai ši procedūra iškviečiama iš SQLCLR išsaugotos procedūros ir pažeidžiamas argumento apribojimas, galite klaidingai gauti sistemos patvirtinimą, nors tikėtumėtės gauti klaidos pranešimą "apribojimo pažeidimas".
Toliau pateikiamas pavyzdys, kaip SQLCLR procedūra pažeidė saugomąją procedūrą:
[SqlProcedure]
viešoji statinė netektis ClrProcCallingTsqlProcWithTvpArgument(out int sum)
{
naudojant (SqlConnection = new SqlConnection("context connection=true"))
{
suma = 0;
DataTable myDataTable = new DataTable("TestTvpType");
myDataTable.Columns.Add("id", typeof(Int32));
myDataTable.Columns.Add("data", typeof(Int32));
Užpildykite TVP, kad jis suaktyvintų PRIMARY KEY VIOLATION klaidą
myDataTable.Rows.Add(1, 1000);
myDataTable.Rows.Add(1, 2000);
SqlParameter parametras = new SqlParameter();
parametrą. ParameterName = "@tvp";
parametrą. SqlDbType = System.Data.SqlDbType.Structured;
parametrą. Value = myDataTable;
SqlCommand command = new SqlCommand("TestTvpProc", ryšys);
komandą. CommandType = CommandType.StoredProcedure;
komandą. Parameters.Add(parametras);
ryšys. Atidaryti ();
naudojant (SqlDataReader skaitytuvas = komanda. ExecuteReader())
{
Nors (skaitytojas. Skaityti ())
{
…;
}
}
}
}
Sprendimas
Ši problema išspręsta šiuose kaupiamuosiuose "„SQL Server“" naujinimuose:
5 kaupiamasis naujinimas, skirtas „SQL Server“ 2016 RTM
2 kaupiamasis naujinimas, skirtas „SQL Server“ 2016 SP1
4 kaupiamasis naujinimas, skirtas "„SQL Server“ 2014" 2 pakeitimų paketui
Atkreipkite dėmesį Dėl šio naujinimo grąžinamas teisingas klaidos pranešimas "constraint violation".
Apie kaupiamuosius „SQL Server“ naujinimus
Kiekviename naujame kaupiamajame „SQL Server“ naujinime yra visos karštosios pataisos ir saugos pataisos, kurios buvo įtrauktos į ankstesnį kaupiamąjį naujinimą. Peržiūrėkite naujausius "„SQL Server“" kaupiamuosius naujinimus:
Naujausias kaupiamasis naujinimas, skirtas „SQL Server“ 2016
Naujausi "„SQL Server“ 2014" kaupiamieji naujinimai
Būsena
„„Microsoft““ patvirtino, kad tai yra „„Microsoft““ produktų, išvardytų dalyje „Taikoma“, problema.
Nuorodos
Sužinokite daugiau apie terminus , kuriuos "„Microsoft“" naudoja apibūdindama programinės įrangos naujinimus.