Změny schémat v databázích publikací

Platí pro: SQL Server Azure SQL Managed Instance

Replikace podporuje širokou škálu změn schématu publikovaných objektů. Když provedete některou z následujících změn schématu u příslušného publikovaného objektu v aplikaci Microsoft SQL Server Publisher, tato změna se ve výchozím nastavení rozšíří pro všechny předplatitele SYSTÉMU SQL Server:

  • ALTER TABLE

  • ALTER TABLE SET LOCK ESCALATIONnemělo by se používat, pokud je povolena replikace změny schématu a topologie zahrnuje předplatitele SQL Server 2005 (9.x) nebo SQL Server Compact 3.5.

  • ALTER VIEW

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • ALTER TRIGGER

    ALTER TRIGGER lze použít pouze pro triggery jazyka pro manipulaci s daty (DML), protože triggery jazyka pro definici dat (DDL) nelze replikovat.

Důležité

Musíte provádět změny schématu v tabulkách pomocí Transact-SQL nebo SQL Server Management Objects (SMO). Když provedete změny schématu v SQL Server Management Studio, Management Studio se pokusí tabulku odstranit a znovu vytvořit. Nemůžete vyřadit publikované objekty, takže změna schématu selže.

Pro transakční replikaci a slučovací replikaci se změny schématu šíří přírůstkově při spuštění Distribution Agent nebo Merge Agent. Při replikaci snímků se změny schématu přenesou při použití nového snímku u odběratele. Při replikaci snímkem se při každé synchronizaci odešle odběrateli nová kopie schématu. Proto jsou všechny změny schématu (nejen ty dříve uvedené) na dříve publikované objekty automaticky propagovány při každé synchronizaci.

Informace o přidávání a odebírání článků z publikací naleznete v tématu Přidávání článků do a Odstraňování článků z existujících publikací.

Replikace změn schématu

Změny schématu uvedené dříve jsou ve výchozím nastavení replikovány. Informace o zakázání replikace změn schématu naleznete v tématu Replikace změn schématu.

Úvahy při změnách schématu

Při replikaci změn schématu mějte na paměti následující aspekty.

Obecné aspekty

  • Změny schématu podléhají jakýmkoli omezením uloženým Transact-SQL. Například ALTER TABLE neumožňuje měnit sloupce primárních klíčů.

  • Mapování datových typů probíhá pouze pro počáteční snímk. Změny schématu se nemapují na předchozí verze datových typů. Například pokud použijete ALTER TABLE ADD datetime2 column v SQL Server 2012 (11.x), datový typ se nepřeloží do nvarchar pro předplatitele SQL Server 2005 (9.x). V některých případech jsou změny schématu na serveru Publisher zablokovány.

  • Pokud nastavíte publikaci tak, aby umožňovala šíření změn schématu, propaguje změny schématu bez ohledu na to, jak nastavit příslušnou možnost schématu pro článek v publikaci. Pokud například vyberete možnost nereplikovat omezení cizího klíče pro článek tabulky, ale pak vydáte ALTER TABLE příkaz, který přidá cizí klíč do tabulky v Publisher, cizí klíč se přidá do tabulky u odběratele. Aby se tomuto chování zabránilo, deaktivujte šíření změn schématu před vydáním příkazu ALTER TABLE .

  • Změny schématu provádějte pouze u Publisher, ne u Subscribers (včetně opětovného publikování Subscribers). Slučovací replikace zabraňuje změnám schématu na odběrateli. Transakční replikace změny nebrání, ale změny mohou způsobit selhání replikace.

  • Změny šířené do odběratele, který znovu publikuje, se ve výchozím nastavení šíří také na jeho odběratele.

  • Pokud změna schématu odkazuje na objekty nebo omezení existující na Publisher, ale ne na předplatitele, změna schématu uspěje na Publisher, ale selže na předplatitele.

  • Všechny objekty na Subscriberovi, na které odkazujete při přidávání cizího klíče, musí mít stejné jméno a vlastníka jako odpovídající objekt na Publisher.

  • Explicitní přidávání, vynechávání nebo změna indexů se nereplikují. Jakoukoli změnu, která zahrnuje explicitní index, musíte provést na každé sadě replik zvlášť. Podporují se indexy vytvořené implicitně pro omezení (například omezení primárního klíče).

  • Není podporováno měnit nebo vynechávat sloupce identity, které replikace spravuje. Další informace o automatické správě sloupců identit najdete v tématu Replikace sloupců identit.

  • Změny schématu zahrnující nedeterministické funkce nejsou podporovány, protože mohou vést k rozdílu dat na Publisher a Subscriber (označováno jako nekonvergence). Pokud například na serveru Publisher zadáte následující příkaz: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), hodnoty se budou lišit, když se příkaz replikuje na server Subscriber a spustí se. Další informace o nedeterministických funkcích naleznete v tématu Deterministické a nedeterministické funkce.

  • Výslovně uveďte omezení. Pokud výslovně neuvádíte omezení, SQL Server vygeneruje název pro toto omezení, a tato jména se liší na Publisher i u každého Subscribera. Tento rozdíl může způsobovat problémy při replikaci změn schématu. Například pokud odstraníte sloupec u vydavatele a dojde k odstranění závislého omezení, replikace se pokusí toto omezení odstranit u odběratele. Operace DROP na odběrateli selže, protože název omezení je odlišný. Pokud synchronizace selže kvůli problému s pojmenováváním omezení, ručně odstraňte omezení u odběratele a pak znovu spusťte Merge Agent.

  • Pokud publikujete tabulku pro replikaci, nemůžete změnit sloupec v této tabulce na datový typ XML, pokud jste už vytvořili snapshot publikace. Pro změnu sloupce musíte nejprve odstranit replikaci.

  • Čtení bez závazku není podporovaná úroveň izolace při DDL na publikované tabulce.

  • Nepoužívejte SET CONTEXT_INFO k úpravě kontextu transakcí, kde se změny schématu provádějí u publikovaných objektů.

Přidání sloupce

  • Pro přidání nového sloupce do tabulky a zahrnutí tohoto sloupce do existující publikace použijte ALTER TABLE <Table> ADD <Column>. Ve výchozím nastavení je pak sloupec replikován všem odběratelům. Sloupec musí povolovat NULL hodnoty nebo obsahovat výchozí omezení. Pro více informací o přidávání sloupců viz sekce "Merge Replication" v tomto článku.

  • Pro přidání nového sloupce do tabulky a nezařazení tohoto sloupce do existující publikace deaktivujte replikaci změn schématu a poté spuskutte ALTER TABLE <Table> ADD <Column>.

  • Pokud chcete do existující publikace zahrnout existující sloupec, použijte sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) nebo dialogové okno Vlastnosti publikace – <Publikace> .

    Další informace naleznete v tématu Definice a úprava filtru sloupce. Tato akce vyžaduje opětovné inicializaci odběrů.

  • Přidání sloupce identity do publikované tabulky není podporováno, protože může vést k nekonvergenci, pokud je sloupec replikován na Subscriber. 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.

Odstranění sloupců

  • Chcete-li odebrat sloupec ze stávající publikace a odstranit tento sloupec z tabulky u vydavatele, spusťte ALTER TABLE <Table> DROP <Column>. Ve výchozím nastavení se sloupec poté odstraní z tabulky na straně všech odběratelů.

  • Pokud chcete odebrat sloupec z existující publikace, ale ponechat sloupec v tabulce u Vydavatele, použijte sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) nebo dialogové okno Vlastnosti publikace – <Publikace>.

    Další informace naleznete v tématu Definice a úprava filtru sloupce. Tato akce vyžaduje vytvoření nového snímku.

  • Nemůžete použít sloupec k vložení filtračních klauzulí žádného článku nebo jakékoli publikace v databázi.

  • Při vyřazování sloupce z publikovaného článku zvažte jakákoli omezení, indexy nebo vlastnosti sloupce, které by mohly ovlivnit databázi. Příklad:

    • Nemůžete vypouštět sloupce použité v primárním klíči z článků v transakčních publikacích, protože je používá replikace.

    • Nemůžete vyřadit rowguid sloupec z článků ve sloučených publikacích ani sloupec mstran_repl_version z článků v transakčních publikacích, které podporují aktualizaci odběrů, protože je používá replikace.

    • Změny indexu nejsou propagovány na odběratele. Pokud u vydavatele odstraníte sloupec a dojde k odstranění závislého indexu, odstranění indexu se nereplikuje. Před odstraněním sloupce na Publikujícím serveru byste měli u Odběratele odstranit index, aby odstranění sloupce při jeho replikaci z Publikujícího serveru na Odběratele proběhlo úspěšně. Pokud synchronizace selže kvůli indexu odběratele, ručně index vypusťte a pak znovu spusťte Merge Agent.

    • Výslovně pojmenujte omezení, abyste je mohli vynechat. Pro více informací viz část "Obecné úvahy" dříve v tomto článku.

Transakční replikace

  • Změny schématu se rozšíří na předplatitele, kteří používají předchozí verze SQL Server, ale příkaz DDL by měl obsahovat pouze syntaxi podporovanou verzí odběratele.

    Pokud odběratel znovu publikuje data, jedinými podporovanými změnami schématu je přidání a vyřazení sloupce. Tyto změny provádějte na Publisher použitím syntaxe sp_repladdcolumn (Transact-SQL) a sp_repldropcolumn (Transact-SQL) místo ALTER TABLE DDL syntaxe.

  • Změny schématu se nereplikují na uživatele mimo SQL Server.

  • Změny schématu nejsou propagovány od vydavatelů mimo SQL Server.

  • Indexované pohledy, které jsou replikovány jako tabulky, nelze upravovat. Indexovaná zobrazení, která jsou replikována jako indexovaná zobrazení, můžete měnit, ale jejich úpravou se z nich stanou běžná zobrazení namísto indexovaných zobrazení.

  • Pokud publikace podporuje odběry s okamžitou aktualizací nebo odběry s aktualizací ve frontě, před provedením změn schématu uveďte systém do klidového stavu: zastavte veškerou aktivitu u publikované tabulky ve vydavateli i odběratelích a propagujte všechny čekající změny dat do všech uzlů. Po šíření změn schématu do všech uzlů může aktivita na publikovaných tabulkách pokračovat.

  • Pokud je publikace v topologii peer-to-peer, před provedením změn schématu uveďte systém do klidového stavu. Další informace najdete v tématu Uvedení topologie replikace do nečinného stavu (Programování replikace pomocí jazyka Transact-SQL).

  • Přidání sloupce časového razítka do tabulky a namapování časového razítka na binary(8) způsobí, že článek bude znovu inicializován pro všechny aktivní odběry.

Slučovací replikace

  • Jak replikace sloučení zpracovává změny schématu závisí na úrovni kompatibility publikace a na tom, zda je snapshot nastaven na nativní režim (výchozí) nebo znakový režim:

    • Pro replikaci změn schématu nastavte úroveň kompatibility publikací alespoň na 90RTM. Pokud předplatitelé používají předchozí verze SQL Server nebo je úroveň kompatibility nižší než 90RTM, použijte sp_repladdcolumn (Transact-SQL) a sp_repldropcolumn (Transact-SQL) k přidání a odebírání sloupců. Tyto postupy jsou však zastaralé.

    • Pokud se pokusíte přidat do existujícího článku sloupec s datovým typem, který byl zaveden v SQL Server 2008 (10.0.x), SQL Server má následující chování:

      100RTM, nativní snímek 100RTM, snímek znaku Všechny ostatní úrovně kompatibility
      hierarchyid Povolit změnu Změna bloku Změna bloku
      zeměpis a geometrie Povolit změnu Povolit změnu* Změna bloku
      Filestream Povolit změnu Změna bloku Změna bloku
      date, time, datetime2 a datetimeoffset Povolit změnu Povolit změnu* Změna bloku

      *Odběratelé SQL Server Compact převádějí tyto datové typy na straně odběratele.

  • Pokud dojde k chybě při použití změny schématu (například chyba vyplývající z přidání cizího klíče odkazujícího na tabulku, která není k dispozici u odběratele), synchronizace selže a předplatné se musí znovu inicializovat.

  • Pokud dojde ke změně schématu ve sloupci, který je součástí filtru spojení nebo parametrizovaného filtru, musíte znovu inicializovat všechna předplatná a znovu vygenerovat snímek.

  • Slučovací replikace poskytuje uložené procedury, které během řešení potíží přeskočí změny schématu. Další informace najdete v tématech sp_markpendingschemachange (Transact-SQL) a sp_enumeratependingschemachanges (Transact-SQL).