Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Database
Stejně jako jiné mechanismy aktualizací databází musí updategramy zpracovávat současné aktualizace dat v multiuživatelském prostředí. Updategramy používají Optimistic Concurrency Control, který porovnává vybraná pole jako snímky, aby zajistil, že data, která mají být aktualizována, nebyla od jejich načtení z databáze změněna jinou uživatelskou aplikací. Updategramy obsahují tyto hodnoty snímků v <předem> bloku updategramů. Před aktualizací databáze aktualizuje aktualizgram hodnoty zadané v bloku <před> s hodnotami aktuálně uloženými v databázi, aby se ujistil, že aktualizace je platná.
Optimistic Concurrency Control nabízí v updategramu tři úrovně ochrany: nízkou (žádnou), střední a vysokou. Úroveň ochrany si můžete určit, pokud odpovídáte aktualizgramu.
Nejnižší úroveň ochrany
Tato úroveň je slepá aktualizace, při které je aktualizace zpracovávána bez ohledu na jiné aktualizace, které byly provedeny od posledního čtení databáze. V takovém případě specifikujete pouze sloupce primárního klíče v bloku <před> záznamem pro identifikaci záznamu a aktualizované informace v bloku <po.>
Například nové kontaktní telefonní číslo v následujícím updategramu je správné, bez ohledu na to, jaké bylo předchozí číslo. Všimněte si, že <blok před> specifikuje pouze sloupec primárního klíče (ContactID).
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
<Person.Contact ContactID="1" />
</updg:before>
<updg:after>
<Person.Contact ContactID="1" Phone="111-111-1111" />
</updg:after>
</updg:sync>
</ROOT>
Střední úroveň ochrany
V této úrovni ochrany aktualizační gram porovnává aktuální hodnoty(y) aktualizovaných dat s hodnotami v databázových sloupcích, aby se zajistilo, že hodnoty nebyly změněny žádnou jinou transakcí od doby, kdy byla data přečtena vaší transakcí.
Tuto úroveň ochrany můžete získat tím, že specifikujete sloupce primárního klíče a sloupce, které aktualizujete v bloku <před.>
Například tento updategram mění hodnotu ve sloupci Telefon tabulky Osoba.Kontakt pro kontakt s ContactID 1. Blok <před> specifikuje atribut Phone , aby se zajistilo, že tato hodnota atributu odpovídá hodnotě v příslušném sloupci v databázi před aplikací aktualizované hodnoty.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
<Person.Contact ContactID="1" Phone="398-555-0132" />
</updg:before>
<updg:after>
<Person.Contact ContactID="1" Phone="111-111-1111" />
</updg:after>
</updg:sync>
</ROOT>
Vysoká úroveň ochrany
Vysoká úroveň ochrany zajišťuje, že záznam zůstává stejný od doby, kdy vaše žádost naposledy přečetla záznam (to znamená, že od té doby, co vaše aplikace záznam přečetla, nebyl změněn žádnou jinou transakcí).
Existují dva způsoby, jak získat tuto vysokou úroveň ochrany proti souběžným aktualizacím:
Zadejte další sloupce v tabulce v bloku <před.>
Pokud v bloku <před> zadáte další sloupce, updategram porovná hodnoty zadané pro tyto sloupce s hodnotami, které byly v databázi před aplikací aktualizace. Pokud se některý ze sloupců záznamu změnil od doby, kdy vaše transakce přečetla záznam, aktualizační gram aktualizaci neprovede.
Například následující updategram aktualizuje název směny, ale specifikuje další sloupce (StartTime, EndTime) v bloku předtím>,< čímž vyžaduje vyšší úroveň ochrany proti současným aktualizacím.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync > <updg:before> <HumanResources.Shift ShiftID="1" Name="Day" StartTime="1900-01-01 07:00:00.000" EndTime="1900-01-01 15:00:00.000" /> </updg:before> <updg:after> <HumanResources.Shift Name="Morning" /> </updg:after> </updg:sync> </ROOT>Tento příklad specifikuje nejvyšší úroveň ochrany tím, že specifikuje všechny sloupce pro záznam v bloku předtím>.<
Zadejte sloupec časového razítka (pokud je k dispozici) v bloku <předtím> .
Místo specifikace všech sloupců záznamů v bloku <před> můžete jednoduše specifikovat sloupec časového razítka (pokud tabulka nějaký má) spolu s sloupci primárního klíče v bloku <předtím> . Databáze aktualizuje sloupec časového razítka na jedinečnou hodnotu po každé aktualizaci záznamu. V tomto případě aktualizační gram porovnává hodnotu časového razítka s odpovídající hodnotou v databázi. Hodnota časového razítka uložená v databázi je binární hodnota. Proto musí být sloupec časového razítka ve schématu zadán jako dt:type="bin.hex",dt:type="bin.base64" nebo sql:datatype="timestamp". (Můžete zadat buď xml datový typ, nebo Microsoft SQL Server datový typ.)
Pro testování updategramu
Vytvořte tuto tabulku v databázi tempdb :
USE tempdb CREATE TABLE Customer ( CustomerID varchar(5), ContactName varchar(20), LastUpdated timestamp)Přidejte tento ukázkový záznam:
INSERT INTO Customer (CustomerID, ContactName) VALUES ('C1', 'Andrew Fuller')Zkopírujte následující XSD schéma a vložte ho do Notepadu. Uložte to jako ConcurrencySampleSchema.xml:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> <xsd:element name="Customer" sql:relation="Customer" > <xsd:complexType> <xsd:attribute name="CustomerID" sql:field="CustomerID" type="xsd:string" /> <xsd:attribute name="ContactName" sql:field="ContactName" type="xsd:string" /> <xsd:attribute name="LastUpdated" sql:field="LastUpdated" type="xsd:hexBinary" sql:datatype="timestamp" /> </xsd:complexType> </xsd:element> </xsd:schema>Zkopírujte následující kód updategramu do Notepadu a uložte ho jako ConcurrencySampleTemplate.xml do stejné složky, kde jste uložili schéma vytvořené v předchozím kroku. (Poznámka: hodnota časového razítka níže pro LastUpdated se bude lišit ve vaší příkladové tabulce Zákazník, takže zkopírujte skutečnou hodnotu LastUpdated z tabulky a vložte ji do updategramu.)
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleSchema.xml" > <updg:before> <Customer CustomerID="C1" LastUpdated = "0x00000000000007D1" /> </updg:before> <updg:after> <Customer ContactName="Robert King" /> </updg:after> </updg:sync> </ROOT>Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.
Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.
Toto je ekvivalentní schéma XDR:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Customer" >
<AttributeType name="CustomerID" />
<AttributeType name="ContactName" />
<AttributeType name="LastUpdated" dt:type="bin.hex"
sql:datatype="timestamp" />
<attribute type="CustomerID" />
<attribute type="ContactName" />
<attribute type="LastUpdated" />
</ElementType>
</Schema>