Freigeben über


Replizieren von Identitätsspalten

Wenn Sie einer Spalte eine IDENTITY-Eigenschaft zuweisen, generiert Microsoft SQL Server für neue Zeilen, die in die Tabelle, die die Identitätsspalte enthält, eingefügt werden, automatisch sequenzielle Zahlwerte. 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. Beim Einfügen der Daten auf den einzelnen Abonnenten erhöht die Replikation jedoch nicht den Identitätsspaltenwert in der Abonnententabelle um 1, sondern es 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 Identitätsspalte auf dem Verleger richten sich nach der Ordnung, in der die Zeilen für die betreffende Tabelle physisch gespeichert sind. 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.

Angeben der Optionen für die Identitätsbereichsverwaltung

Die Replikation bietet die folgenden drei Optionen für die Identitätsbereichsverwaltung:

  • Automatisch. Diese Option ist bei Mergereplikationen und Transaktionsreplikationen mit Update auf den Abonnenten zu verwenden. Geben Sie die Größenbereiche für den Verleger und die Abonnenten an. Die Replikation übernimmt dann automatisch die Zuweisung der neuen Bereiche. Die Replikation aktiviert die Option NOT FOR REPLICATION für die Identitätsspalte auf dem Abonnenten, sodass nur Benutzereinfügungen zu einer inkrementellen Erhöhung des Werts auf dem Abonnenten führen.

    Hinweis

    Die Abonnenten müssen mit dem Verleger synchronisiert werden, um die neuen Bereiche zu empfangen. 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 Diese Option ist bei Momentaufnahme- und Transaktionsreplikationen ohne Updates auf dem Abonnenten, bei Peer-zu-Peer-Transaktionsreplikationen und in den Fällen zu verwenden, in denen Ihre Anwendung die Identitätsbereiche programmgesteuert kontrollieren 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 aktiviert die Option NOT FOR REPLICATION für die Identitätsspalte auf dem 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 wird in allen Knoten in einer Topologie verwendet. Wenn Sie beispielsweise ab 1 mit einem Inkrement von 1 verwenden smallint , beträgt die maximale Anzahl von Einfügevorgängen 32.767 für den Verleger und alle Abonnenten. 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 mit verzögertem Update ü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 der Einfügevorgang von einem Benutzer ausgeführt wurde, der sich nicht in dieser Rolle befindet, müssen der Protokolllese-Agent, 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 zu einem Fehler bei der INSERT-Anweisung führen, wenn ein Identitätsbereich während einer umfangreichen Einfügung, z. B. einer INSERT INTO-Anweisung, ausgeschöpft ist.

Datentyp Range
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

Weitere Informationen zu einer automatisch inkrementierten Zahl, die in mehreren Tabellen verwendet oder aus Anwendungen aufgerufen werden kann, ohne dass auf eine Tabelle verwiesen wird, finden Sie unter Sequenznummern.

Mergereplikation

Identitätsbereiche werden vom Verleger verwaltet und vom Merge-Agent an die Abonnenten weitergegeben (in einer Wiederveröffentlichungshierarchie werden die Bereiche vom Stammverleger und den Neuverlegern verwaltet). Die Identitätswerte werden auf dem Verleger aus einem Pool zugewiesen. Wenn Sie im Assistenten für neue Veröffentlichungen oder mithilfe von sp_addmergearticle (Transact-SQL) zu einer Veröffentlichung einen Artikel mit einer Identitätsspalte hinzufügen, geben Sie Werte für folgendes an:

  • @identity_range -Parameter: Mit diesem Parameter wird die Größe des Identitätsbereichs gesteuert, der dem Verleger und den Abonnenten mit Clientabonnements anfänglich zugeordnet wird.

    Hinweis

    Für Abonnenten, die frühere Versionen von SQL Server ausführen, steuert dieser Parameter (anstelle des @pub_identity_range-Parameters) auch die Identitätsbereichsgröße beim erneuten Veröffentlichen von Abonnenten.

  • @pub_identity_range -Parameter: Mit diesem Parameter wird die Größe des Identitätsbereichs für die Wiederveröffentlichung gesteuert, der den Abonnenten mit Serverabonnements zugeordnet ist (erforderlich für die Wiederveröffentlichung von Daten). Alle Abonnenten mit Serverabonnenten erhalten einen Bereich zur Wiederveröffentlichung, auch wenn sie gar keine Daten erneut veröffentlichen.

  • Der @threshold-Parameter, der verwendet wird, um zu bestimmen, wann ein neuer Identitätsbereich für ein Abonnement für SQL Server Compact oder eine frühere Version von SQL Server erforderlich ist.

So könnten Sie z. B. für @identity_range 10.000 und für @pub_identity_range500.000 angeben. Dem Verleger und allen Abonnenten, die SQL Server 2005 oder einer höheren Version ausgeführt werden, einschließlich des Abonnenten mit dem Serverabonnement, wird ein primärer Bereich von 10000 zugewiesen. Dem Abonnenten mit dem Serverabonnement wird zudem der Primärbereich 500.000 zugewiesen, der von den 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 ebenfalls einen Wert für @identity_range, @pub_identity_rangeund @threshold angeben).

Jeder Abonnenten, der SQL Server 2005 oder höher ausgeführt wird, erhält auch 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.

Transaktionsreplikation mit Abonnements mit verzögertem Update über eine Warteschlange

Die Identitätsbereiche werden vom Verteilungs-Agent auf dem Verteiler verwaltet und an die Abonnenten weitergegeben. 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) zu einer Veröffentlichung einen Artikel mit einer Identitätsspalte hinzufügen, geben Sie Werte für folgendes an:

  • @identity_range -Parameter: Mit diesem Parameter wird die Größe des Identitätsbereichs gesteuert, der allen Abonnenten anfänglich zugeordnet wird.

  • @pub_identity_range -Parameter: Mit diesem Parameter wird die Größe des Identitätsbereichs gesteuert, der dem Verleger zugeordnet wird.

  • @threshold -Parameter: Anhand dieses Parameters wird bestimmt, wann ein neuer Bereich für ein Abonnement erforderlich ist.

So könnten Sie z. B. für @pub_identity_range10.000, für @identity_range 1.000 (unter der Annahme einer geringeren Anzahl von Updates auf dem Abonnenten) und für @threshold80 Prozent angeben. Nach 800 Einfügungen auf einem Abonnenten (80 Prozent von 1.000) wird einem Abonnenten ein neuer Bereich zugewiesen. Nach 8.000 Einfügungen auf dem Verleger wird dem Verleger ein neuer Bereich zugewiesen. Beim Zuweisen eines neuen Bereichs ergibt sich jedoch eine Lücke in den Identitätsbereichswerten in der Tabelle. 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. Stellen Sie sich z. B. eine Tabelle auf dem Verleger mit einer als IDENTITY(1,1)definierten Identitätsspalte vor: Die Identitätsspalte beginnt mit 1 und erhöht sich bei jeder neu eingefügten Zeile um 1. Wenn die Tabelle auf dem Verleger 5.000 Zeilen besitzt und Sie für den weiteren Entwicklungsverlauf der Anwendung eine gewisse Vergrößerung der Tabelle erwarten, könnte der Verleger den Bereich 1-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. Auf Abonnent A würden Sie dazu z. B. DBCC CHECKIDENT('<TableName>','reseed',10001)ausführen. Auf Abonnent B ist dann CHECKIDENT('<TableName>','reseed',20001)auszuführen.

Zum Zuweisen neuer Bereiche zum Verleger bzw. zu den Abonnenten führen Sie DBCC CHECKIDENT aus, und geben Sie einen neuen Wert als Ausgangswert für die Tabelle an. Auf irgendeine Weise müssen Sie auch bestimmen, 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 Verleger aus einer Sicherung wiederhergestellt wird, müssen Sie selbst sicherstellen, dass dem Verleger ein entsprechender Bereich zugewiesen wird. Weisen Sie für die Mergereplikation mithilfe von sp_restoremergeidentityrange (Transact-SQL) einen neuen Bereich 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:

  1. Beenden Sie alle Aktivitäten auf allen Abonnenten.

  2. Gehen Sie für jede veröffentlichte Tabelle, die eine Identitätsspalte enthält, wie folgt vor:

    1. Führen Sie in der Abonnementdatenbank auf jedem Abonnenten IDENT_CURRENT('<TableName>')aus.

    2. Notieren Sie sich den höchsten Wert, den Sie bei den Abonnenten gefunden haben.

    3. Führen Sie in der Veröffentlichungsdatenbank auf dem Verleger DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>) aus.

    4. Führen Sie in der Veröffentlichungsdatenbank auf dem Verleger 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.

Weitere Informationen

BACKUP (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL)
IDENT_CURRENT (Transact-SQL)
IDENTITY (Eigenschaft) (Transact-SQL)
sp_adjustpublisheridentityrange (Transact-SQL)