Replikace sloupců identity

Platí pro: SQL Server Azure SQL Managed Instance

Když přiřadíte IDENTITY vlastnost ke sloupci, Microsoft SQL Server automaticky vygeneruje sekvenční čísla pro nové řádky vložené do tabulky obsahující sloupec identity. Další informace naleznete v tématu IDENTITY (Vlastnost) (Transact-SQL). Protože sloupce identity můžou být součástí primárního klíče, je důležité se vyhnout duplicitním hodnotám ve sloupcích identity. Chcete-li použít sloupce identity v topologii replikace, která obsahuje aktualizace na více než jednom uzlu, musí každý uzel v topologii replikace používat jiný rozsah hodnot identity, aby nedošlo k duplicitám.

Například Publisher může být přiřazen rozsah 1–100, Odběratel A rozsah 101–200 a Odběratel B rozsah 201–300. Pokud je řádek vložen do Publisher a hodnota identity je například 65, tato hodnota se replikuje do každého odběratele. Když replikace vloží data u každého odběratele, nezvýší hodnotu sloupce identity v tabulce odběratele; místo toho se vloží doslovná hodnota 65. Pouze vložení provedená uživatelem, nikoli vložení provedená agentem replikace, způsobí zvýšení hodnoty sloupce IDENTITY.

Replikace zpracovává sloupce identit napříč všemi typy publikací a předplatných, což umožňuje spravovat sloupce ručně nebo je automaticky spravovat replikace.

Note

Přidání sloupce identity do publikované tabulky se nepodporuje, protože při replikaci sloupce do odběratele může dojít k nekonvergenci. Hodnoty ve sloupci identity v Publisheru závisí na pořadí, ve kterém jsou řádky ovlivněné tabulky fyzicky uložené. Řádky mohou být uloženy odlišně u odběratele; proto se hodnota sloupce identity může lišit pro stejné řádky.

Určení možnosti správy rozsahu identit

Replikace nabízí tři možnosti správy rozsahu identit:

  • Automatické. Používá se pro slučovací replikaci a transakční replikaci s aktualizacemi u odběratele. Zadejte rozsahy velikosti pro Vydavatele a odběratele a replikace bude automaticky spravovat přidělování nových rozsahů. Replikace nastaví u sloupce identity u odběratele možnost NOT FOR REPLICATION, takže se u odběratele hodnota inkrementuje pouze při vložení provedeném uživatelem.

    Note

    Předplatitelé musí synchronizovat s Publisher, aby mohli přijímat nové rozsahy. Vzhledem k tomu, že odběratelé jsou přiřazené rozsahy identit automaticky, je možné, aby každý odběratel vyčerpal celou nabídku rozsahů identit, pokud opakovaně požaduje nové rozsahy.

  • Příručka. Používá se pro snímkovou a transakční replikaci bez aktualizací v odběrateli, transakční replikaci mezi dvěma účastníky nebo v případě, že vaše aplikace musí řídit rozsahy identit prostřednictvím kódu programu. Pokud zvolíte ruční správu, musíte zajistit, aby byly rozsahy přiřazeny Vydavateli a každému Odběrateli a aby byly při vyčerpání počátečních rozsahů přiřazeny nové rozsahy. Replikace nastaví možnost NOT FOR REPLICATION u sloupce identity odběratele.

  • None. Tato možnost je doporučena pouze pro zpětnou kompatibilitu se staršími verzemi SQL Server a je dostupná pouze z rozhraní uložených procedur pro transakční publikace.

Pokud chcete zadat možnost správy rozsahu identit, přečtěte si téma Správa sloupců identit.

Přiřazování rozsahů identit

Replikace sloučením a transakční replikace používají různé metody přiřazování rozsahů; tyto metody jsou popsány v této části.

Při replikaci sloupců s vlastností IDENTITY je potřeba zohlednit dva typy rozsahů: rozsahy přiřazené vydavateli a odběratelům a rozsah datového typu ve sloupci. Následující tabulka ukazuje rozsahy dostupné pro datové typy, které se obvykle používají ve sloupcích identit. Rozsah se používá napříč všemi uzly v topologii. Pokud například použijete typ smallint počínaje hodnotou 1 a s přírůstkem 1, maximální počet vložených záznamů je 32 767 pro vydavatele a všechny odběratele. Skutečný počet vložení závisí na tom, jestli jsou v použitých hodnotách mezery a jestli se použije prahová hodnota. Další informace o prahových hodnotách naleznete v následujících částech „Merge Replication“ a „Transactional Replication with Queued Updating Subscriptions“.

Pokud Publisher po vložení vyčerpá rozsah identity, může automaticky přiřadit novou oblast, pokud vložení provedl člen db_owner pevné databázové role. Pokud vložení provedl uživatel, který není v této roli, musí agent Log Reader, Merge Agent nebo uživatel, který je členem role db_owner, spustit sp_adjustpublisheridentityrange (Transact-SQL). V případě transakčních publikací musí být agent Log Reader spuštěn, aby automaticky přidělil nový rozsah (výchozí hodnota je, aby agent běžel nepřetržitě).

Warning

Při hromadném vkládání větší dávky dat se replikační trigger spustí pouze jednou, nikoli pro každý vkládaný řádek. To může vést k selhání příkazu INSERT, pokud se během rozsáhlého vkládání vyčerpá rozsah hodnot identity, například u příkazu INSERT INTO.

Datový typ Rozmezí
tinyint Nepodporuje se pro automatickou správu.
smallint -2^15 (-32 768) až 2^15-1 (32 767)
int -2^31 (-2 147 483 648) až 2^31-1 (2 147 483 647)
bigint -2^63 (-9 223 372 036 854 775 808) až 2^63-1 (9 223 372 036 854 775 807)
desetinné a numerické -10^38+1 až 10^38-1

Note

Pokud chcete vytvořit automaticky inkrementující číslo, které lze použít ve více tabulkách nebo které lze volat z aplikací bez odkazování na libovolnou tabulku, podívejte se na pořadová čísla.

Slučovací replikace

Rozsahy identit jsou spravovány vydavatelem a předávány odběratelům agentem sloučení (v hierarchii opětovného publikování jsou rozsahy spravovány kořenovým vydavatelem a vydavateli, kteří publikují znovu). Hodnoty identity jsou přiřazovány z fondu u Vydavatele. Když přidáte článek se sloupcem identity do publikace v Průvodci novou publikací nebo pomocí sp_addmergearticle (Transact-SQL), zadáte hodnoty pro:

  • Parametr @identity_range, který řídí velikost rozsahu identit zpočátku přiděleného jak vydavateli, tak odběratelům s klientskými odběry.

    Note

    U odběratelů, kteří používají předchozí verze SQL Server, tento parametr (nikoli @pub_identity_range parametr) také řídí velikost rozsahu identit při opětovném publikování odběratelů.

  • Parametr @pub_identity_range , který řídí velikost rozsahu identit pro opakované publikování přidělené odběratelům se serverovými předplatnými (vyžadováno pro opakované publikování dat). Všem odběratelům se serverovým předplatným je přidělen rozsah pro opětovné publikování, i když data ve skutečnosti znovu nepublikují.

  • Parametr@threshold, který se používá k určení, kdy se vyžaduje nový rozsah identit pro předplatné SQL Server Compact nebo předchozí verze SQL Server.

Můžete například zadat 1 0000 pro @identity_range a 500000 pro @pub_identity_range. Vydavateli a všem odběratelům se serverem SQL Server 2005 (9.x) nebo novější verzí, včetně odběratele s odběrem serveru, je přiřazen primární rozsah 10000. Odběrateli se serverovým předplatným je také přiřazen primární rozsah 500000, který mohou používat odběratelé synchronizující se se znovu publikujícím odběratelem (pro články v publikaci u znovu publikujícího odběratele musíte také zadat @identity_range, @pub_identity_range a @threshold).

Každý předplatitel se systémem SQL Server 2005 (9.x) nebo novější verzí obdrží také sekundární rozsah identit. Sekundární oblast je rovna velikosti primární oblasti; když dojde k vyčerpání primárního rozsahu, použije se sekundární oblast a Merge Agent přiřadí odběrateli nový rozsah. Nový rozsah se stane sekundární oblastí a proces pokračuje, protože odběratel používá hodnoty identity.

Transakční replikace s předplatnými ve frontě

Rozsahy identit jsou spravovány Distributorem a šířeny Odběratelům Agentem distribuce. Hodnoty identity se přiřazují z fondu distributora. Velikost fondu závisí na velikosti datového typu a inkrementu použitého u sloupce identity. Když přidáte článek se sloupcem identity do publikace v Průvodci novou publikací nebo pomocí sp_addarticle (Transact-SQL), zadáte hodnoty pro:

  • Parametr @identity_range , který určuje velikost rozsahu identit, která byla původně přidělena všem odběratelům.

  • Parametr@pub_identity_range, který řídí velikost rozsahu identit přidělenou Publisher.

  • Parametr @threshold , který se používá k určení, kdy se pro předplatné vyžaduje nový rozsah identit.

Můžete například zadat 1 0000 pro @pub_identity_range, 1000 pro @identity_range (za předpokladu menšího počtu aktualizací u odběratele) a 80 procent pro @threshold. Po 800 vloženích u odběratele (80 procent z 1000) je odběrateli přiřazen nový rozsah. Po 8000 vloženích v Publisheru je Publisheru přiřazen nový rozsah. Při přiřazení nového rozsahu vznikne v tabulce mezera v hodnotách rozsahu identity. Nastavení vyšší prahové hodnoty vede k menším mezerám, ale systém je méně odolný vůči chybám: pokud Distribution Agent z nějakého důvodu nemůže být spuštěn, Odběratel by mohl snadněji vyčerpat hodnoty identity.

Přiřazení rozsahů pro ruční správu rozsahů identit

Pokud zadáte ruční správu rozsahů identit, musíte zajistit, aby Publisher a každý odběratel používali různé rozsahy identit. Představte si například tabulku na Publisher s sloupcem identity definovaným taktoIDENTITY(1,1): sloupec identity začíná na 1 a při každém vložení řádku se zvýší o 1. Pokud má tabulka na Publisher 5 000 řádků a očekáváte, že v tabulce v průběhu životnosti aplikace dojde k určitému nárůstu, může Publisher použít rozsah 1–10 000. Vzhledem k dvěma odběratelům by odběratel A mohl použít 10 001–20 000 a odběratel B by mohl použít 20 001–30 000.

Po inicializaci odběratele pomocí snímku nebo prostřednictvím jiného prostředku spusťte DBCC CHECKIDENT a přiřaďte odběrateli výchozí bod pro jeho rozsah identit. Například u odběratele A byste spustili DBCC CHECKIDENT('<TableName>','reseed',10001). U odběratele B byste spustili CHECKIDENT('<TableName>','reseed',20001).

Chcete-li vydavateli nebo odběratelům přiřadit nové rozsahy, spusťte příkaz DBCC CHECKIDENT a zadejte novou hodnotu pro opětovné nastavení identity tabulky. Měli byste mít nějaký způsob, jak určit, kdy se musí přiřadit nový rozsah. Vaše aplikace může mít například mechanismus, který zjistí, kdy se uzel chystá použít jeho rozsah, a přiřadit nový rozsah pomocí DBCC CHECKIDENT. Můžete také přidat omezení kontroly, které zajistí, že řádek nelze přidat, pokud by to způsobilo použití hodnoty identity mimo rozsah.

Zpracování rozsahů identit po obnovení databáze

Pokud používáte automatickou správu rozsahu identit, když se odběratel obnoví ze zálohy, automaticky požádá o nový rozsah hodnot identity. Pokud je server Publisher obnoven ze zálohy, musíte zajistit, aby měl Publisher přiřazen odpovídající rozsah. Pro slučovací replikaci přiřaďte novou oblast pomocí sp_restoremergeidentityrange (Transact-SQL). U transakční replikace určete nejvyšší použitou hodnotu a pak nastavte výchozí bod pro nové rozsahy. Po obnovení databáze publikace použijte následující postup:

  1. Zastavte všechny aktivity u všech odběratelů.

  2. Pro každou publikovanou tabulku, která obsahuje sloupec identity:

    1. V databázi předplatného u každého odběratele spusťte IDENT_CURRENT('<TableName>').

    2. Zaznamenejte nejvyšší hodnotu nalezenou u všech odběratelů.

    3. V databázi publikace v Publisher spusťte DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>).

    4. V databázi publikace v Publisher spusťte sp_adjustpublisheridentityrange <PublicationName>, <TableName>.

    Note

    Pokud je hodnota ve sloupci identity nastavená tak, aby se dekrementovala místo přírůstku, poznamenejte si nalezenou nejnižší hodnotu a pak znovu zadejte tuto hodnotu.