Oprava: Chybová zpráva při pokusu o vložení dat na předplatitel slučovací replikace v SQL Server 2005: "Msg 548, úroveň 16, stav 2, řádek 1. Vložení se nezdařilo"

Chyba č: 50002854 (SQL Hotfix)
Společnost Microsoft distribuuje opravy Microsoft SQL Server 2005 jako jeden soubor ke stažení. Protože jsou kumulativní opravy, každá nová verze tedy obsahuje všechny opravy hotfix a verzí oprav všech oprav zabezpečení, které byly součástí předchozích SQL Server 2005.

Příznaky

Zvažte následující scénář. V SQL Server 2005 nakonfigurujete slučovací publikaci. Přidejte do tabulky obsahující sloupec identity do publikace hromadné korespondence. Potom vložit data do tabulky na vydavatele. Synchronizovat data mezi odběratele a vydavatele a potom zkuste vložit další data na vydavatele. V tomto scénáři obdržíte následující chybová zpráva na vydavatele:
Msg 548, úroveň 16, stav 2, řádek 1
Vložení se nezdařilo. Ke konfliktu s omezením kontrola identity rozsah v databázi 'název_databáze', replikované tabulky "schéma. Název tabulky", sloupec"Název_sloupce". Pokud sloupec identity automaticky spravuje replikace, aktualizovat rozsah takto: u vydavatel, provést sp_adjustpublisheridentityrange; pro odběratele, spustit agenta distribuce nebo sloučit Agent.
Pokud se pokusíte spustit sp_adjustpublisheridentityrange uložené procedury na vydavatele a jak je uvedeno v chybové zprávě, ani nyní nemůžete vyřešit potíže.

K tomuto problému dochází, když více agentů sloučení synchronizace dat současně stejné publikace hromadné korespondence. Tento problém i, mohou nadále pokračovalo Pokud máte mnoho odběratelům slučovací publikaci.

Příčina

K tomuto problému dochází, protože aktuální hodnotu identity v tabulce na vydavatele není v dosahu kontrolního omezení identity rozsah identity. K tomuto chování dochází, když více agentů sloučení se pokuste zvýšit rozsah identity najednou vytvořením další rozsah identity na vydavatele.

Řešení

Oprava tohoto problému byla vydána nejprve v kumulativní aktualizaci 8. Další informace o možnostech získání tohoto balíčku kumulativní aktualizace pro SQL Server 2005 Service Pack 2 klepněte na následující číslo článku databáze Microsoft Knowledge Base:
951217 kumulativní aktualizace balíčku 8 pro SQL Server 2005 Service Pack 2
Poznámka: Vzhledem k tomu, sestavení jsou kumulativní, každá nová verze oprava obsahuje všechny opravy hotfix a verzí oprav všech oprav zabezpečení, které byly součástí předchozích SQL Server 2005. Společnost Microsoft doporučuje zvážit použití nejnovější vydání oprava, která obsahuje tuto opravu hotfix. Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
937137 SQL Server 2005 vytvoří, které byly vydány po vydání serveru SQL Server 2005 Service Pack 2
Opravy hotfix pro Microsoft SQL Server 2005 jsou vytvořeny pro konkrétní aktualizace service Pack pro SQL Server. Opravy hotfix serveru SQL Server 2005 Service Pack 2 musí použít k instalaci aplikace SQL Server 2005 Service Pack 2. Ve výchozím žádné opravy hotfix, která je poskytována v aktualizace service pack serveru SQL Server je součástí další aktualizaci service pack pro SQL Server.

Jak potíže obejít

Chcete-li tento problém vyřešit, je nutné zabránit synchronizace více souběžných sloučení. Chcete-li to provést, nastavte vlastnost max_concurrent_merge do publikace hromadné korespondence spuštěním následujícího příkazu:
sp_changemergepublication '<PublicationName>', 'max_concurrent_merge', 1
Poznámka: Po použití tohoto zástupného řešení může snížit výkon, pokud máte mnoho odběratelům v publikaci. K tomuto chování dochází, protože pouze jeden účastník může synchronizovat data v čase.

Stav

Společnost Microsoft potvrdila, že se jedná o problém v produktech společnosti Microsoft, které jsou uvedeny v části "Platí pro".

Další informace

Jak lze zjistit, zda se vás tento problém

Chcete-li zjistit, zda se vás tento problém, postupujte takto:
  1. Ověřte, zda aktuální hodnota identity je menší než dolní mez první rozsah kontrolního omezení identity rozsah identity.

    Chcete-li získat aktuální hodnotu identity, spusťte následující příkaz:
    SELECT IDENT_CURRENT ('<TableName>')
    Získání kontrolního omezení identity rozsah identity rozsahy, spusťte některý z následujících příkazů:
    Výpis 1
    sp_helpconstraint '<TableName>'
    Výpis 2
    select * from MSmerge_identity_rangewhere is_pub_range <>1
    AND artid IN
    (select artid from sysmergearticles where name='<TableName>')
    AND subid in
    (select subid from sysmergesubscriptions MS
    join sysmergepublications MP
    on MS.subscriber_server=MP.publisher
    AND MS.db_name = MP.publisher_db
    WHERE name='<PublicationName>'
    )

  2. Trasování SQL Server Profiler použijte k určení, zda prokládaném spuštění sp_MSsetup_publisher_idrange uložený postup spustil samostatné relace sloučit Agent pro danou publikaci.

    Však prokládaném spuštění sp_MSsetup_publisher_idrange uložený postup vždy znamenat, že se jedná o tento problém. To je protože SQL Server Profiler nebyla spuštěna při vygenerování původní výskyt slučovací synchronizaci první chybová zpráva. Prokládaném spuštění sp_MSsetup_publisher_idrange uložený postup však zvyšuje pravděpodobnost výskytu tohoto problému.
  3. Můžete najít překrývající se synchronizací sloučení, ke kterým dochází při zobrazí, že "548" chybová zpráva. Chcete-li to provést, můžete zkontrolovat historii korespondence v distribuční databáze. Chcete-li to provést, spusťte následující příkazy:
    Use distributionGO
    select session_id, agent_id, B.publication, min(time) as StartTime, max(time) as EndTime
    into #sessiontimes
    from dbo.MSmerge_history A
    join dbo.msmerge_agents B
    on A.agent_id = B.id
    group by session_id, agent_id, publication
    order by 3 desc
    GO
    -- The left side result is the original session. The right side result is the overlapping session.
    select A.*, B.*
    from #sessiontimes A
    Join #sessiontimes B
    On B.StartTime >= A.StartTime
    AND B.StartTime <= A.EndTime
    AND A.session_id <> B.session_id
    And A.publication=B.publication
    Order By A.StartTime asc
    GO
    drop table #sessiontimes

Jak opravit existující poškození identity rozsahy problematické tabulky

Po instalaci kumulativní aktualizace nebo použít metodu, která je popsána v části řešení, stávající rozsah poškozené identity v tabulce není opraven. Stále obdržíte "548" chybová zpráva při pokusu o vložení dat do tabulky a synchronizaci dat na odběratele. Musíte proto ručně opravit rozsahy poškozené identity v tabulce. Chcete-li to provést, postupujte takto.

Poznámka: Tyto kroky zahrnují ručně přepíše aktuální hodnoty osiva identity tabulky správně reseed hodnotu identity na vydavatele. V poškozené stavu aktuální hodnota identity je menší než první oblast v slučovací replikace identity rozsah kontrolního omezení identity. Kroky ručně zvýšit hodnotu identity poklesnou uvnitř rozsahu identity, která je definovaná pomocí slučovací replikace identity rozsah kontrolního omezení. Tyto kroky předpokládají, že identity jsou konfigurovány vzestupné způsobem a zda je přírůstek pro identitu konfigurována zvýšit o hodnotu 1.
  1. Potvrďte, že hodnota přírůstku identity je 1 a že totožnost pokračuje ve vzestupném způsobem. Hodnota přírůstku identity lze získat spuštěním následujícího příkazu na vydavatele:
    SELECT IDENT_INCR( '<TableName>')
  2. V aplikaci publisher najít aktuální hodnotu identity v sloupec identity problematické, spusťte následující příkaz:
    DBCC CHECKIDENT ('<TableName>')
    Poté, co obdržíte výsledek, poznamenejte si hodnotu aktuální hodnotu identity pro porovnání v dalších krocích. Všimněte si, že
    aktuální hodnota sloupce valye může být větší nebo menší než hodnota aktuální hodnoty identity .


    Pokud je aktuální hodnota sloupce hodnota větší než hodnota aktuální hodnoty identity , může hodnota sloupce na jiné replikace v topologii pochází a úspěšně sloučeny s replikace aplikace publisher. Pokud je aktuální hodnota sloupce hodnota menší než hodnota aktuální hodnoty identity , hodnoty může byly vloženy na vydavatele v dřívější době pomocí příkazu SET IDENTITY_INSERT ON před konfiguraci replikace hromadné korespondence.
  3. V aplikaci publisher k určení, zda že aktuální identity rozsahy identity rozsah zkontrolovat omezení k tabulce problematické, spusťte následující příkazy:
    Use <PublishedDatabaseName>GO
    sp_helpconstraint '<TableName>'
    GO

    Poté, co obdržíte výsledek, Všimněte si hodnoty
    constraint_keys sloupce záznamu, kde hodnota
    constraint_name sloupec je "repl_identity_range_GUID". Hodnota GUID odpovídá hodnota
    artid sloupec pro článek v sysmergearticles systémová tabulka. Chcete-li získat identifikátor GUID, spusťte následující příkaz:
    select artid from sysmergearticles where name = '<TableName>'
    Kontrolního omezení identity rozsah zahrnuje dva samostatné rozsahy. Dvě sady rozsahy nemusí sousedit. Hodnota sloupce constraint_keys může být například takto:
    ([Název_sloupce] > (1001) a [Název_sloupce] < =(2001)

    NEBO [Název_sloupce] > (9001) a [Název_sloupce] < =(10001))
    Poznámka: V tomto článku používá k předložení kódu ve zbývající kroky v tomto příkladu.

    V tomto příkladu span rozsahy každé hodnoty 1000. 1000 je výchozí velikost rozsahu. Můžete však změnit velikost rozsah identity pomocí jedné z následujících metod:
    • Při spuštění sp_addmergearticle uložené procedury, zadejte parametr @pub_identity_range .
    • Změnit vlastnost velikost rozsah Subscriber v článku
      Dialogové okno Vlastnosti článku .
  4. Pokud dojde k potížím, která je popsána v části "Příznaky", by měla být menší než dolní mez první identity rozsah kontrolního omezení identity rozsah, kterou jste si poznamenali v kroku 3 na aktuální hodnotu identity, kterou jste si poznamenali v kroku 2.

    Pokud je aktuální hodnota identity v kroku 2 je větší než horní mez druhá oblast identity rozsah identity omezení check, vyřešit problém pomocí metody, které se doporučuje v chybové zprávě. Proto byste měli spustit sp_adjustpublisheridentityrange uložený postup na vydavatele.

    Další informace o postupu sp_adjustpublisheridentityrange uložené naleznete následujícím webu Microsoft Developer Network (MSDN):
  5. Spusťte následující příkaz k určení, zda jsou všechny řádky v aktuální identity rozsahy kontrolního omezení identity rozsah:
    SELECT COUNT(*) FROM TableName WHERE ([ColumnName]>(1001) AND [ColumnName]<=(2001) 
    OR [ColumnName]>(9001) AND [ColumnName]<=(10001))

    Poznámky
    • Pokud příkaz vrátí hodnotu 0, žádné řádky jsou v oblasti aktuální identity. V takovém případě přejděte ke kroku 6.
    • Pokud příkaz vrátí hodnotu, která je větší než 0, spusťte následující příkaz získat hodnoty maximální identity v aktuální identity rozsahy:
      SELECT MAX(ColumnName) as MaxValue FROM TableName WHERE ([ColumnName]>(1001) AND [ColumnName]<=(2001) OR 
      [ColumnName]>(9001) AND [ColumnName]<=(10001))

      Poznámka: Vrácená hodnota a potom přejděte ke kroku 7.
  6. Ručně reseed aktuální identitu pro problematické tabulky spadat do platného rozsahu.


    Reseed aktuální identitu na nejnižší hodnotu aktuální identity rozsahy plus 1. Například je-li nejnižší hodnotu aktuální identity rozsahy 1001, první možnou hodnotou v rozsahu je 1002 protože používá nízké konec rozsahu kontrolního omezení identity rozsah větší než znaménko (>). Chcete-li to provést, spusťte následující příkaz na vydavatele a potom přejděte ke kroku 8:
    DBCC CHECKIDENT ('TableName', RESEED, 1002)
  7. Ručně reseed aktuální identitu pro problematické tabulky spadat do platného rozsahu.

    Předpokládejme, že je přírůstek pro identitu 1. Reseed aktuální identitu na hodnotu, kterou jste si poznamenali v kroku 5 a přidejte 1. Například pokud je hodnota, kterou jste si poznamenali v kroku 5 1507, reseed aktuální identitu na. 1508. Chcete-li to provést, spusťte následující příkaz na vydavatele:
    DBCC CHECKIDENT ('TableName', RESEED, 1508)
  8. Chcete-li zjistit, zda nových řádků do tabulky v databázi aplikace publisher bez výskytu 548 Chyba testu.
Další informace o jaké soubory byly změněny a informace o všechny požadavky nutné pro instalaci balíčku kumulativní aktualizace obsahující opravy hotfix popsané v tomto článku znalostní báze Microsoft Knowledge Base klepnutím na následující číslo článku databáze Microsoft Knowledge Base:
951217 kumulativní aktualizace balíčku 8 pro SQL Server 2005 Service Pack 2

Odkazy

Další informace o seznamu sestavení, které jsou k dispozici po SQL Server Service Pack 2 klepněte na následující číslo článku databáze Microsoft Knowledge Base:
937137 SQL Server 2005 vytvoří, které byly vydány po vydání serveru SQL Server 2005 Service Pack 2
Další informace o přírůstkové Model servis pro SQL Server získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
935897 dílčí Model obsluhy je k dispozici z týmu SQL Server doručit opravy hotfix pro nahlášené potíže
Další informace o možnostech získání aktualizace SQL Server 2005 Service Pack 2 klepněte na následující číslo článku databáze Microsoft Knowledge Base:
913089 jak získat nejnovější aktualizaci service pack pro SQL Server 2005
Další informace o nových funkcích a vylepšeních v aktualizaci SQL Server 2005 Service Pack 2 naleznete na následujícím webu společnosti Microsoft:Další informace o schéma názvů pro aktualizace serveru SQL Server klepněte na následující číslo článku databáze Microsoft Knowledge Base:
822499 nové schéma přidělování názvů pro Microsoft SQL Server software balíčky aktualizací.
Pro další informace o terminologii používané v aktualizacích softwaru, klepněte na následující číslo článku k zobrazení článku v databázi Microsoft Knowledge Base:
824684 Popis standardní terminologie používané při popisu aktualizací softwaru společnosti Microsoft
Vlastnosti

ID článku: 953481 - Poslední kontrola: 14. 1. 2017 - Revize: 1

Váš názor