Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL Managed Instance
Wenn Sie einer Spalte eine IDENTITY Eigenschaft zuweisen, generiert Microsoft SQL Server automatisch sequenzielle Zahlen für neue Zeilen, die in die Tabelle eingefügt werden, die die Identitätsspalte enthält. Weitere Informationen finden Sie unter IDENTITY (Eigenschaft) (Transact-SQL). Da Identitätsspalten als Teil des Primärschlüssels aufgenommen werden können, ist es wichtig, dass die Identitätsspalten keine doppelten Werte enthalten. Wenn Identitätsspalten in einer Replikationstopologie verwendet werden sollen, die an mehreren Knoten Updates besitzt, muss jeder Knoten in der Replikationstopologie einen anderen Bereich von Identitätswerten verwenden, damit es nicht zu Dopplungen kommt.
Beispielsweise kann dem Verleger der Bereich 1-100 zugewiesen werden, dem Abonnent A der Bereich 101-200 und dem Abonnent B der Bereich 201-300. Wenn beim Verleger eine Zeile eingefügt wird und der Identitätswert beispielsweise 65 beträgt, wird der Wert für jeden Abonnenten repliziert. Wenn die Replikation bei jedem Abonnenten Daten einfügt, erhöht sie den Wert der Identitätsspalte in der Abonnententabelle nicht; stattdessen wird der Literalwert 65 eingefügt. Eine inkrementelle Erhöhung des Identitätsspaltenwerts erfolgt nur bei Benutzereinfügungen, nicht jedoch bei Einfügungen durch einen Replikations-Agent.
Die Replikation behandelt die Identitätsspalten in allen Veröffentlichungs- und Abonnementtypen und ermöglicht es Ihnen so, die Spalten entweder selbst manuell zu verwalten oder die Spalten automatisch durch die Replikation verwalten zu lassen.
Hinweis
Das Hinzufügen einer Identitätsspalte zu einer veröffentlichten Tabelle wird nicht unterstützt, da ein solcher Vorgang zu Nichtkonvergenz führen kann, wenn die Spalte auf den Abonnenten repliziert wird. Die Werte in der IDENTITY-Spalte beim Publisher hängen von der Reihenfolge ab, in der die Zeilen der betroffenen Tabelle physisch gespeichert werden. Es ist möglich, dass die Zeilen auf dem Abonnenten anders gespeichert sind, sodass der Wert für die Identitätsspalte für dieselben Zeilen unterschiedlich sein kann.
Festlegen einer Option für die Identitätsbereichsverwaltung
Die Replikation bietet die folgenden drei Optionen für die Identitätsbereichsverwaltung:
Automatisch. Wird für die Mergereplikation und die Transaktionsreplikation mit Aktualisierungen beim Abonnenten verwendet. Legen Sie die Größenbereiche für den Publisher und die Abonnenten fest, und die Replikation übernimmt dann automatisch die Zuweisung neuer Bereiche. Die Replikation setzt beim Abonnenten die Option NOT FOR REPLICATION für die Identitätsspalte, sodass nur vom Benutzer ausgeführte Einfügungen dazu führen, dass der Wert beim Abonnenten erhöht wird.
Hinweis
Die Abonnenten müssen sich mit dem Publisher synchronisieren, um neue Bereiche zu erhalten. Da den Abonnenten die Identitätsbereiche automatisch zugewiesen werden, ist es für alle Abonnenten möglich, sämtliche Identitätsbereiche auszuschöpfen, wenn wiederholt neue Bereiche angefordert werden.
Manuell. Wird für Snapshotreplikation und Transaktionsreplikation ohne Aktualisierungen beim Abonnenten, Peer-to-Peer-Transaktionsreplikation oder verwendet, wenn Ihre Anwendung Identitätsbereiche programmatisch steuern muss. Wenn Sie die manuelle Verwaltung angeben, müssen Sie sicherstellen, dass dem Verleger und den einzelnen Abonnenten Bereiche zugewiesen werden und dass neue Bereiche zugeordnet werden, sofern die anfänglichen Bereiche verwendet werden. Die Replikation setzt die Option NOT FOR REPLICATION für die IDENTITY-Spalte beim Abonnenten.
Keine. Diese Option sollte nur für die Rückwärtskompatibilität mit früheren SQL Server-Versionen verwendet werden. Bei Transaktionsveröffentlichungen ist die Option nur über die gespeicherte Prozedur verfügbar.
Informationen zum Angeben einer Option für die Identitätsbereichsverwaltung finden Sie unter Verwalten von Identitätsspalten.
Zuweisen von Identitätsbereichen
Bei der Mergereplikation und der Transaktionsreplikation kommen zum Zuweisen von Bereichen unterschiedliche Methoden zum Einsatz. Diese Methoden werden im Folgenden näher beschrieben.
Beim Replizieren von Identitätsspalten sind die folgenden beiden Bereichstypen zu berücksichtigen: Bereiche, die dem Verleger und den Abonnenten zugewiesen werden, und der Bereich des Datentyps in der Spalte. Die folgende Tabelle enthält eine Übersicht über die für die Datentypen verfügbaren Bereiche, die in der Regel in Identitätsspalten verwendet werden. Der Bereich gilt für alle Knoten in einer Topologie. Wenn Sie z. B. smallint beginnend mit 1 und einem Inkrement von 1 verwenden, sind maximal 32.767 Einfügungen für den Verleger und alle Abonnenten zulässig. Die tatsächliche Anzahl der Einfügungen hängt davon ab, ob es in den verwendeten Werten Lücken gibt und ob ein Schwellenwert verwendet wird. Weitere Informationen zu Schwellenwerten finden Sie in den folgenden Abschnitten „Mergereplikation“ und „Transaktionsreplikation mit Abonnements für verzögerte Aktualisierung über eine Warteschlange“.
Wenn der Verleger nach einer Einfügung seinen Identitätsbereich ausgeschöpft hat, kann er automatisch einen neuen Bereich zuweisen, wenn die Einfügung von einem Mitglied mit der festen db_owner -Datenbankrolle ausgeführt wurde. Wenn die Einfügung von einem Benutzer mit einer anderen Rolle ausgeführt wird, muss der Protokolllese-Agent, der Merge-Agent oder ein Benutzer, der Mitglied der db_owner-Rolle ist, sp_adjustpublisheridentityrange (Transact-SQL) ausführen. Bei Transaktionsveröffentlichungen muss der Protokolllese-Agent ausgeführt werden, damit automatisch ein neuer Bereich zugeordnet wird (der Agent wird standardmäßig ununterbrochen ausgeführt).
Warnung
Während einer umfangreichen Batcheinfügung wird der Replikationstrigger nur einmal und nicht für jede eingefügte Zeile ausgelöst. Dies kann zum Fehlschlagen einer INSERT-Anweisung führen, wenn während eines umfangreichen Einfügevorgangs ein Identitätsbereich aufgebraucht wird, wie z. B. bei einer INSERT INTO-Anweisung.
| Datentyp | Bereich |
|---|---|
| tinyint | Keine Unterstützung bei automatischer Verwaltung |
| smallint | -2^15 (-32,768) bis 2^15-1 (32,767) |
| int | -2^31 (-2.147.483.648) bis 2^31-1 (2.147.483.647) |
| bigint | -2^63 (-9.223.372.036.854.775.808) bis 2^63-1 (9.223.372.036.854.775.807) |
| decimal und numeric | -10^38+1 bis 10^38-1 |
Hinweis
Zum Erstellen einer automatisch inkrementierten Nummer, die in mehreren Tabellen verwendet oder von Anwendungen aus abgerufen werden kann, ohne auf eine Tabelle zu verweisen, siehe Sequenznummern.
Mergereplikation
Identitätsbereiche werden vom Publisher verwaltet und vom Merge-Agent an die Abonnenten übertragen (in einer Hierarchie zur Weiterveröffentlichung werden die Bereiche vom Stammpublisher und den Republishern verwaltet). Die Identitätswerte werden beim Publisher aus einem Pool zugewiesen. Wenn Sie im Assistenten für neue Veröffentlichungen oder mit sp_addmergearticle (Transact-SQL) einen Artikel mit einer Identitätsspalte zu einer Veröffentlichung hinzufügen, geben Sie Werte an für:
Mit dem Parameter
@identity_rangesteuern Sie die Größe des Identitätsbereichs, der dem Verleger und den Abonnenten mit Clientabonnements anfänglich zugeordnet wird.Hinweis
Bei Abonnenten, die frühere Versionen von SQL Server verwenden, steuert dieser Parameter (anstelle des Parameters
@pub_identity_range) auch die Größe des Identitätsbereichs bei den wiederveröffentlichenden Abonnenten.Mit dem Parameter
@pub_identity_rangesteuern Sie die Größe des Identitätsbereichs für die Wiederveröffentlichung, der den Abonnenten mit Serverabonnements zugeordnet wird (erforderlich für die Wiederveröffentlichung von Daten). Alle Abonnenten mit einem Server-Abonnement erhalten einen Bereich für die erneute Veröffentlichung, auch wenn sie tatsächlich keine Daten erneut veröffentlichen.Mit dem Parameter
@thresholdbestimmen Sie, wann ein neuer Identitätsbereich für ein Abonnement von SQL Server Compact oder eine frühere Version von SQL Server erforderlich ist.
So könnten Sie z. B. 10000 für @identity_range und 500000 für @pub_identity_range angeben. Dem Verleger und allen Abonnenten, die SQL Server 2005 (9.x) oder eine höhere Version ausführen, einschließlich des Abonnenten mit dem Serverabonnement, wird der Primärbereich 10.000 zugewiesen. Dem Abonnenten mit dem Serverabonnement wird zudem der Primärbereich 500000 zugewiesen, der von Abonnenten verwendet werden kann, die eine Synchronisierung mit dem Wiederveröffentlichungsabonnenten ausführen (für die Artikel in der Veröffentlichung auf dem Wiederveröffentlichungsabonnenten müssen Sie auch einen Wert für @identity_range, @pub_identity_range und @threshold angeben).
Jeder Abonnent, auf dem SQL Server 2005 (9.x) oder eine höhere Version ausgeführt wird, erhält darüber hinaus einen sekundären Identitätsbereich. Der sekundäre Bereich entspricht in seiner Größe der Größe des Primärbereichs. Wenn der Primärbereich ausgeschöpft ist, wird der sekundäre Bereich verwendet, und der Merge-Agent weist dem Abonnenten einen neuen Bereich zu. Der neue Bereich wird zum sekundären Bereich, und der Prozess wird fortgesetzt, während der Abonnent Identitätswerte verwendet.
Transaktionsreplikation mit Abonnements für warteschlangengestützte Aktualisierung
Die Identitätsbereiche werden vom Verteiler verwaltet und vom Verteilungs-Agent an die Abonnenten übermittelt. Die Identitätswerte werden auf dem Verteiler aus einem Pool zugewiesen. Die Größe des Pools richtet sich nach der Größe des Datentyps und des für die Identitätsspalte verwendeten Inkrements. Wenn Sie im Assistenten für neue Veröffentlichungen oder mithilfe von sp_addarticle (Transact-SQL) einen Artikel mit einer Identitätsspalte zu einer Veröffentlichung hinzufügen, geben Sie Werte an für:
Mit dem Parameter
@identity_rangesteuern Sie die Größe des Identitätsbereichs, der allen Abonnenten anfänglich zugeordnet wird.Mit dem Parameter
@pub_identity_rangesteuern Sie die Größe des Identitätsbereichs, der dem Verleger zugeordnet wird.Mit dem Parameter
@thresholdbestimmen Sie, wann ein neuer Identitätsbereich für ein Abonnement erforderlich ist.
So könnten Sie z. B. 10000 für @pub_identity_range, 1000 für @identity_range (unter der Annahme, dass beim Abonnenten weniger Updates anfallen) und 80 Prozent für @threshold angeben. Nach 800 Einfügungen bei einem Abonnenten (80 Prozent von 1000) wird diesem Abonnenten ein neuer Wertebereich zugewiesen. Nach 8.000 Einfügevorgängen beim Publisher wird dem Publisher ein neuer Bereich zugewiesen. Wenn ein neuer Bereich zugewiesen wird, entsteht in der Tabelle eine Lücke in den Werten des Identitätsbereichs. Durch Angabe eines höheren Schwellenwerts fallen diese Lücken zwar kleiner aus, das System ist dann aber auch weniger fehlertolerant, d. h., wenn der Verteilungs-Agent aus irgendeinem Grund nicht ausgeführt werden kann, gehen einem Abonnenten möglicherweise schneller die Identitäten aus.
Zuweisen von Bereichen für die manuelle Identitätsbereichsverwaltung
Wenn Sie die manuelle Identitätsbereichsverwaltung angeben, müssen Sie sicherstellen, dass der Verleger und alle Abonnenten verschiedene Identitätsbereiche verwenden. Betrachten Sie beispielsweise eine Tabelle beim Publisher mit einer als IDENTITY(1,1) definierten Identitätsspalte: Die Identitätsspalte beginnt bei 1 und wird jedes Mal, wenn eine Zeile eingefügt wird, um 1 erhöht. Wenn die Tabelle beim Publisher 5.000 Zeilen umfasst und Sie über die Lebensdauer der Anwendung mit einem gewissen Wachstum der Tabelle rechnen, könnte der Publisher den Bereich von 1 bis 10.000 verwenden. Bei Vorhandensein zweier Abonnenten könnte der Abonnent A den Bereich 10.001 bis 20.000 und der Abonnent B den Bereich 20.001 bis 30.000 verwenden.
Nachdem ein Abonnent mit einer Momentaufnahme oder auf andere Weise initialisiert wurde, führen Sie DBCC CHECKIDENT aus, um dem Abonnenten einen Anfangspunkt für dessen Identitätsbereich zuzuweisen. Zum Beispiel würden Sie bei Abonnent A DBCC CHECKIDENT('<TableName>','reseed',10001) ausführen. Bei Abonnent B würden Sie CHECKIDENT('<TableName>','reseed',20001) ausführen.
Um dem Publisher oder den Abonnenten neue Wertebereiche zuzuweisen, führen Sie DBCC CHECKIDENT aus, und geben Sie einen neuen Wert an, um die Tabelle erneut zu initialisieren. Sie sollten über eine Möglichkeit verfügen, festzustellen, wann ein neuer Bereich zugewiesen werden muss. So könnte Ihre Anwendung z. B. einen Mechanismus besitzen, der erkennt, wann ein Knoten seinen Bereich fast ausgeschöpft hat, und mithilfe von DBCC CHECKIDENT einen neuen Bereich zuweisen. Sie können auch eine CHECK-Einschränkung hinzufügen, um sicherzustellen, dass keine Zeile hinzugefügt wird, wenn dies zum Verwenden eines außerhalb des Bereichs liegenden Identitätswerts führen würde.
Umgang mit Identitätsbereichen nach einer Datenbankwiederherstellung
Wenn Sie die automatische Identitätsbereichsverwaltung verwenden und ein Abonnent aus einer Sicherung wiederhergestellt wird, fordert dieser Abonnent automatisch einen neuen Bereich von Identitätswerten an. Wenn ein Publisher aus einer Sicherungskopie wiederhergestellt wird, müssen Sie sicherstellen, dass dem Publisher ein geeigneter Bereich zugewiesen wird. Für die Mergereplikation weisen Sie einen neuen Bereich mit sp_restoremergeidentityrange (Transact-SQL) zu. Bei Transaktionsreplikationen müssen Sie den höchsten Wert bestimmen, der verwendet wurde, und dann den Anfangspunkt für neue Bereiche festlegen. Gehen Sie nach dem Wiederherstellen der Veröffentlichungsdatenbank wie folgt vor:
Beenden Sie sämtliche Aktivitäten bei allen Abonnenten.
Gehen Sie für jede veröffentlichte Tabelle, die eine Identitätsspalte enthält, wie folgt vor:
Führen Sie in der Abonnementdatenbank bei jedem Abonnenten
IDENT_CURRENT('<TableName>')aus.Notieren Sie sich den höchsten Wert, den Sie bei den Abonnenten gefunden haben.
Führen Sie in der Veröffentlichungsdatenbank beim Verlag
DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>) aus.Führen Sie in der Publikationsdatenbank beim Publisher
sp_adjustpublisheridentityrange <PublicationName>, <TableName>aus.
Hinweis
Wenn für den Wert in der Identitätsspalte festgelegt wurde, dass er verringert statt vergrößert werden soll, notieren Sie sich den niedrigsten gefundenen Wert, und legen Sie diesen Wert dann als neuen Ausgangswert fest.