Vornehmen von Schemaänderungen in Veröffentlichungsdatenbanken
Die Replikation unterstützt eine umfangreiche Reihe von Schemaänderungen an veröffentlichten Objekten. Wenn Sie eine der folgenden Schemaänderungen am entsprechenden veröffentlichten Objekt auf einem MicrosoftSQL Server-Verleger vornehmen, wird diese Änderung standardmäßig an alle SQL Server-Abonnenten weitergegeben:
ALTER TABLE
ALTER TABLE SET LOCK ESCALATION darf nicht verwendet werden, wenn die Schemaänderungsreplikation aktiviert ist und eine Topologie SQL Server 2005- oder SQL Server Compact 3.5-Abonnenten enthält. ALTER VIEW
ALTER PROCEDURE
ALTER FUNCTION
ALTER TRIGGER
ALTER TRIGGER kann nur für DML-Trigger [Data Manipulation Language] verwendet werden, da DLL-Triggers [Data Definition Language] nicht repliziert werden können.
Wichtig |
---|
Schemaänderungen an Tabellen müssen mithilfe von Transact-SQL oder SQL Server Management Objects (SMO) vorgenommen werden. Wenn Schemaänderungen in SQL Server Management Studio vorgenommen werden, versucht Management Studio die Tabelle zu löschen und neu zu erstellen. Da veröffentlichte Objekte nicht gelöscht werden können, schlägt die Schemaänderung fehl. |
Bei der Transaktions- und der Mergereplikation werden Schemaänderungen inkrementell weitergegeben, sobald der Verteilungs-Agent oder der Merge-Agent ausgeführt wird. Bei der Snapshotreplikation werden Schemaänderung weitergegeben, wenn ein neuer Snapshot auf den Abonnenten angewendet wird. Außerdem wird bei der Snapshotreplikation eine neue Kopie des Schemas bei jeder Synchronisierung an den Abonnenten gesendet. Deshalb werden alle Schemaänderungen (nicht nur die oben aufgeführten) an bereits veröffentlichten Objekten automatisch bei jeder Synchronisierung weitergegeben.
Informationen zum Hinzufügen oder Entfernen von Artikeln finden Sie unter Hinzufügen und Löschen von Artikeln bei vorhandenen Veröffentlichungen.
So replizieren Sie Schemaänderungen
Die oben aufgeführten Schemaänderungen werden standardmäßig repliziert. Informationen zum Deaktivieren der Replikation von Schemaänderungen finden Sie in den folgenden Themen:
SQL Server Management Studio: Vorgehensweise: Replizieren von Schemaänderungen (SQL Server Management Studio)
Replikationsprogrammierung mit Transact-SQL: Vorgehensweise: Replizieren von Schemaänderungen (Replikationsprogrammierung mit Transact-SQL)
Überlegungen zu Schemaänderungen
Beachten Sie beim Replizieren von Schemaänderungen Folgendes:
Allgemeine Überlegungen
Schemaänderungen unterliegen den Einschränkungen von Transact-SQL. Beispielsweise können Sie mit ALTER TABLE keine Primärschlüsselspalten ändern.
Datentypzuordnung wird nur für den Anfangssnapshot ausgeführt. Schemaänderungen werden nicht vorherigen Versionen von Datentypen zugeordnet. Beispiel: Wenn die ALTER TABLE ADD datetime2 column-Anweisung in SQL Server 2008 verwendet wird, wird der Datentyp nicht für SQL Server 2005-Abonnenten in nvarchar umgewandelt. In einigen Fällen werden Schemaänderungen auf dem Verleger blockiert.
Wenn für eine Veröffentlichung die Weitergabe von Schemaänderungen festgelegt ist, werden die Schemaänderungen unabhängig davon weitergegeben, wie die verbundene Schemaoption für einen Artikel in der Veröffentlichung festgelegt ist. Beispiel: Sie entscheiden sich, FOREIGN KEY-Einschränkungen für einen Tabellenartikel nicht zu replizieren, geben dann jedoch einen ALTER TABLE-Befehl aus, mit dem der Tabelle auf dem Verleger ein Fremdschlüssel hinzugefügt wird. In diesem Fall wird der Fremdschlüssel der Tabelle auf dem Abonnenten hinzugefügt. Um das zu verhindern, deaktivieren Sie die Weitergabe von Schemaänderungen, bevor Sie den ALTER TABLE-Befehl ausgeben.
Schemaänderungen sollten nur auf dem Verleger und nicht auf den Abonnenten (einschließlich Wiederveröffentlichungsabonnenten) ausgegeben werden. Die Mergereplikation verhindert Schemaänderungen auf dem Abonnenten. Die Transaktionsreplikation verhindert die Änderungen zwar nicht, es können jedoch Fehler bei der Replikation auftreten.
An einen Wiederveröffentlichungsabonnenten weitergegebene Änderungen werden standardmäßig an dessen Abonnenten weitergegeben.
Verweist die Schemaänderung auf Objekte oder Einschränkungen, die auf dem Verleger, aber nicht auf dem Abonnenten vorhanden sind, ist die Schemaänderung auf dem Verleger erfolgreich, schlägt jedoch auf dem Abonnenten fehl.
Alle Objekte auf dem Abonnenten, auf die beim Hinzufügen eines Fremdschlüssels verwiesen wird, müssen denselben Namen und Besitzer aufweisen wie das entsprechende Objekt auf dem Verleger.
Ein explizites Hinzufügen, Löschen oder Ändern von Indizes wird nicht unterstützt. Implizit für Einschränkungen erstellte Indizes (wie z. B. Primärschlüsseleinschränkungen) werden unterstützt.
Das Ändern oder Löschen von Identitätsspalten, die von der Replikation verwaltet werden, wird nicht unterstützt. Weitere Informationen zur automatischen Verwaltung von Identitätsspalten finden Sie unter Replizieren von Identitätsspalten.
Schemaänderungen, die nicht deterministische Funktionen einschließen, werden nicht unterstützt, da daraus unterschiedliche Daten auf dem Verleger und dem Abonnenten resultieren können (eine so genannte mangelnde Konvergenz). Wenn Sie beispielsweise folgenden Befehl auf dem Verleger ausgeben: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), und der Befehl wird auf den Abonnenten repliziert und ausgeführt, dann unterscheiden sich die Werte. Weitere Informationen zu nicht deterministischen Funktionen finden Sie unter Deterministische und nicht deterministische Funktionen.
Es wird empfohlen, Einschränkungen explizit zu benennen. Wenn eine Einschränkung nicht explizit benannt wird, generiert SQL Server einen Namen für die Einschränkung, und diese Namen sind auf dem Verleger und jedem Abonnenten unterschiedlich. Dies kann bei der Replikation von Schemaänderungen zu Problemen führen. Wenn Sie z. B. auf dem Verleger eine Spalte löschen und eine abhängige Einschränkung ebenfalls gelöscht wird, wird bei der Replikation versucht, die Einschränkung auf dem Abonnenten zu löschen. Der Löschvorgang auf dem Abonnenten erzeugt jedoch einen Fehler, da die Einschränkung einen anderen Namen hat. Löschen Sie die Einschränkung manuell auf dem Abonnenten, und führen Sie den Merge-Agent anschließend erneut aus, wenn die Synchronisierung aufgrund eines Problems mit dem Einschränkungsnamen einen Fehler erzeugt.
Wenn eine Tabelle für die Replikation veröffentlicht wird, ist es nicht möglich, eine Spalte in dieser Tabelle in den Datentyp XML zu ändern, wenn bereits ein Veröffentlichungssnapshot generiert wurde. Um die Spalte zu ändern, müssen Sie die Replikation zuerst entfernen. Weitere Informationen finden Sie unter Entfernen der Replikation.
Hinzufügen von Spalten
Wenn Sie einer Tabelle eine neue Spalte hinzufügen und die Spalte in eine vorhandene Veröffentlichung einschließen möchten, führen Sie ALTER TABLE <Table> ADD <Column> aus. Die Spalte wird dann standardmäßig auf alle Abonnenten repliziert. Die Spalte muss NULL-Werte zulassen oder eine Standardeinschränkung einschließen. Weitere Informationen über das Hinzufügen von Spalten finden Sie im Abschnitt „Mergereplikation“ in diesem Thema.
Wenn Sie einer Tabelle eine neue Spalte hinzufügen und diese Spalte nicht in eine vorhandene Veröffentlichung einschließen möchten, führen Sie ALTER TABLE <Table> ADD <Column> aus.
Um eine vorhandene Spalte in eine vorhandene Veröffentlichung einzuschließen, verwenden Sie sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) oder das Dialogfeld Veröffentlichungseigenschaften - <Veröffentlichung>.
Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines Spaltenfilters (Replikationsprogrammierung mit Transact-SQL) und Vorgehensweise: Definieren und Ändern eines Spaltenfilters (SQL Server Management Studio). Dies erfordert, dass Sie Abonnements erneut initialisieren.
Einer veröffentlichten Tabelle eine Identitätsspalte hinzuzufügen, wird nicht unterstützt, da dies beim Replizieren der Spalte auf dem Abonnenten zu mangelnder Konvergenz führen kann. Die Werte in der Identitätsspalte auf dem Verleger richten sich nach der Ordnung, in der die Zeilen für die betreffende Tabelle physisch gespeichert sind. Die Zeilen werden möglicherweise auf dem Abonnenten unterschiedlich gespeichert. Deshalb kann sich der Wert für die Identitätsspalte bei denselben Zeilen unterscheiden.
Löschen von Spalten
Wenn Sie eine Spalte aus einer vorhandenen Veröffentlichung löschen und die Spalte aus der Tabelle auf dem Verleger löschen möchten, führen Sie ALTER TABLE <Table> DROP <Column> aus. Standardmäßig wird die Spalte dann aus der Tabelle auf allen Abonnenten gelöscht.
Um eine Spalte aus einer vorhandenen Veröffentlichung zu löschen, die Spalte jedoch in der Tabelle auf dem Verleger beizubehalten, verwenden Sie sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) oder das Dialogfeld Veröffentlichungseigenschaften - <Veröffentlichung>.
Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines Spaltenfilters (Replikationsprogrammierung mit Transact-SQL) und Vorgehensweise: Definieren und Ändern eines Spaltenfilters (SQL Server Management Studio). Dies erfordert, dass Sie einen neuen Snapshot generieren.
Die zu löschende Spalte darf nicht in den Filterklauseln eines Artikels einer Veröffentlichung in der Datenbank verwendet werden.
Beim Löschen einer Spalte aus einem veröffentlichten Artikel sollten Sie alle Einschränkungen, Indizes oder Eigenschaften der Spalte berücksichtigen, die sich auf die Datenbank auswirken können. Beispiel:
Sie können keine in einem Primärschlüssel verwendeten Spalten aus Artikeln in Transaktionsveröffentlichungen löschen, da die Spalten von der Replikation verwendet werden.
Sie können die rowguid-Spalte nicht aus Artikeln in Mergeveröffentlichungen oder die mstran_repl_version-Spalte aus Artikeln in Transaktionsveröffentlichungen löschen, die das Aktualisieren von Abonnements unterstützen, da diese Spalten von der Replikation verwendet werden.
Indexänderungen werden nicht an die Abonnenten weitergegeben: Wenn Sie eine Spalte auf dem Verleger löschen und ein abhängiger Index ebenfalls gelöscht wird, wird das Löschen des Indexes nicht repliziert. Sie sollten den Index auf dem Abonnenten löschen, bevor Sie die Spalte auf dem Verleger löschen, damit das Löschen der Spalte erfolgreich ausgeführt wird, wenn es vom Verleger auf den Abonnenten repliziert wird. Löschen Sie den Index manuell, und führen Sie den Merge-Agent anschließend erneut aus, wenn die Synchronisierung aufgrund eines Indexes auf dem Abonnenten einen Fehler erzeugt.
Einschränkungen sollten explizit benannt werden, um Löschvorgänge zu ermöglichen. Weitere Informationen finden Sie im Abschnitt "Allgemeine Überlegungen" weiter oben in diesem Thema.
Transaktionsreplikation
Schemaänderungen werden zwar an Abonnenten weitergegeben, auf denen frühere Versionen von SQL Server ausgeführt werden, die DDL-Anweisung sollte jedoch nur Syntax einschließen, die von der Version auf dem Abonnenten unterstützt wird.
Wenn der Abonnent Daten erneut veröffentlicht, bestehen die einzigen Schemaänderungen im Hinzufügen und Löschen einer Spalte. Nehmen Sie diese Änderungen auf dem Verleger mithilfe von sp_repladdcolumn (Transact-SQL) und sp_repldropcolumn (Transact-SQL) vor und nicht mit der ALTER TABLE DDL-Syntax.
Schemaänderungen werden nur an SQL Server-Abonnenten weitergegeben.
Von Nicht-SQL Server-Verlegern werden keine Schemaänderungen weitergegeben.
Sie können indizierte Sichten, die als Tabellen repliziert werden, nicht ändern. Indizierte Sichten, die als indizierte Sichten repliziert werden, können geändert werden. Durch die Änderung sind sie jedoch keine indizierten Sichten mehr, sondern werden zu herkömmlichen Sichten.
Wenn die Veröffentlichung mit sofort aktualisierbaren Abonnements oder mit Abonnements mit verzögertem Aktualisieren über eine Warteschlange unterstützt, muss das System in einen inaktiven Status versetzt werden, bevor Schemaänderungen vorgenommen werden: jede Aktivität an der veröffentlichten Tabelle muss auf dem Verleger und den Abonnenten angehalten und ausstehende Datenänderungen müssen an alle Knoten weitergegeben werden. Nach der Weitergabe der Schemaänderungen an alle Knoten können die Aktivitäten an den veröffentlichten Tabellen fortgesetzt werden.
Befindet sich die Veröffentlichung in einer Peer-to-Peer-Topologie, muss das System in einen inaktiven Status versetzt werden, bevor Schemaänderungen vorgenommen werden. Weitere Informationen finden Sie unter Vorgehensweise: Versetzen einer Replikationstopologie in einen inaktiven Status (Replikationsprogrammierung mit Transact-SQL).
Wenn Sie einer Tabelle eine timestamp-Spalte hinzufügen und diese wird einer binary(8)-Spalte zugeordnet, dann wird der Artikel für alle aktiven Abonnements erneut initialisiert.
Mergereplikation
Wie Mergereplikation Schemaänderungen behandelt werden, hängt ab vom Veröffentlichungskompatibilitätsgrad, und ob der Snapshot auf systemeigenen Modus (Standard) oder auf Zeichenmodus eingestellt ist:
Zum Replizieren von Schemaänderungen muss die Veröffentlichung mindestens einen Kompatibilitätsgrad von 90RTM aufweisen. Wenn Abonnenten frühere Versionen von SQL Server ausführen oder der Kompatibilitätsgrad niedriger als 90RTM ist, können Sie sp_repladdcolumn (Transact-SQL) und sp_repldropcolumn (Transact-SQL) zum Hinzufügen bzw. Löschen von Spalten verwenden. Allerdings sind diese Prozeduren veraltet.
Wenn Sie versuchen, zu einem Artikel eine Spalte mit einem Datentyp hinzuzufügen, der in SQL Server 2008 eingeführt wurde, verhält sich SQL Server wie folgt:
100RTM, systemeigener Snapshot
100RTM, Snapshot im Zeichenmodus
Alle übrigen Kompatibilitätsgrade
hierarchyid
Änderung zulassen
Änderung blockieren
Änderung blockieren
geography und geometry
Änderung zulassen
Änderung zulassen1
Änderung blockieren
filestream
Änderung zulassen
Änderung blockieren
Änderung blockieren
date, time, datetime2 und datetimeoffset
Änderung zulassen
Änderung zulassen1
Änderung blockieren
1 Abonnenten von SQL Server Compact konvertieren diese Datentypen beim Abonnenten.
Weitere Informationen zur Veröffentlichungskompatibilität finden Sie im Abschnitt „Kompatibilitätsgrad von Mergeveröffentlichungen“ im Thema Verwenden mehrerer Versionen von SQL Server in einer Replikationstopologie.
Falls beim Anwenden einer Schemaänderung ein Fehler auftritt, schlägt die Synchronisierung fehl, und das Abonnement muss erneut initialisiert werden. (Ein Fehler kann z. B. auftreten, wenn ein hinzugefügter Fremdschlüssel auf eine Tabelle verweist, die auf dem Abonnenten nicht verfügbar ist.)
Wird eine Schemaänderung an einer Spalte vorgenommen, die von einem Verknüpfungsfilter oder parametrisierten Filter betroffen ist, müssen Sie alle Abonnements erneut initialisieren und den Snapshot neu generieren.
Die Mergereplikation stellt gespeicherte Prozeduren bereit, mit denen Schemaänderungen bei der Problembehandlung ausgelassen werden können. Weitere Informationen finden Sie unter sp_markpendingschemachange (Transact-SQL) und sp_enumeratependingschemachanges (Transact-SQL).
Siehe auch