CREATE SEQUENCE (Transact-SQL)

  • 04/11/2017
  • 10 minutes to read
    • W
    • c
    • r
    • M
    • m
    • +7

Applies to: yesSQL Server (all supported versions) YesAzure SQL Database

Creates a sequence object and specifies its properties. Eine Sequenz ist ein benutzerdefiniertes schemagebundenes Objekt, das eine Sequenz numerischer Werte gemäß der Spezifikation generiert, mit der die Sequenz erstellt wurde. Die Reihenfolge der numerischen Werte wird in aufsteigender oder absteigender Reihenfolge in einem definierten Intervall generiert und kann so konfiguriert werden, dass sie bei Erschöpfung neu gestartet wird (Zyklus). Sequenzen sind im Gegensatz zu Identitätsspalten nicht bestimmten Tabellen zugeordnet. Anwendungen verweisen auf ein Sequenzobjekt, um seinen nächsten Wert abzurufen. Die Beziehung zwischen Sequenzen und Tabellen wird von der Anwendung gesteuert. Benutzeranwendungen können auf ein Sequenzobjekt verweisen und die Werte über mehrere Zeilen und Tabellen hinweg koordinieren.

Im Gegensatz zu Identitätsspaltenwerten, die beim Einfügen von Zeilen generiert werden, kann eine Anwendung die nächste Sequenznummer abrufen, ohne die Zeile einzufügen, indem sie die Funktion NEXT VALUE FOR aufruft. Verwenden Sie sp_sequence_get_range , um mehrere Sequenznummern gleichzeitig abzurufen.

Informationen und Szenarien, die sowohl CREATE SEQUENCE als auch NEXT VALUE FOR function verwenden, finden Sie unter Sequenznummern.

Themenlink-Symbol Transact-SQL-Syntaxkonventionen

Syntax

CREATE SEQUENCE sequence_name ] } | { NO MINVALUE } ] } | { NO MAXVALUE } ] } | { NO CACHE } ] 

Hinweis

Informationen zur Transact-SQL-Syntax für SQL Server 2014 und frühere Versionen finden Sie in der Dokumentation zu früheren Versionen.

Arguments

sequence_name
Gibt den eindeutigen Namen an, unter dem die Sequenz in der Datenbank bekannt ist. Typ ist sysname.

Gibt die Grenzen für das Sequence-Objekt an. Der standardmäßige Mindestwert für ein neues Sequenzobjekt ist der Mindestwert des Datentyps des Sequenzobjekts. Dies ist Null für den tinyint-Datentyp und eine negative Zahl für alle anderen Datentypen.

Eigenschaft, die angibt, ob das Sequenzobjekt vom Minimalwert (oder Maximum für absteigende Sequenzobjekte) neu gestartet oder eine Ausnahme ausgelöst werden soll, wenn der Minimal- oder Maximalwert überschritten wird. Die standardmäßige Zyklusoption für neue Sequenzobjekte ist KEIN ZYKLUS.

Hinweis

Das Radfahren einer SEQUENZ startet vom Minimal- oder Maximalwert aus neu, nicht vom Startwert.

/ NO CACHE ]
Erhöht die Leistung für Anwendungen, die Sequenzobjekte verwenden, indem die Anzahl der Festplattenspeicher minimiert wird, die zum Generieren von Sequenznummern erforderlich sind. Standardmäßig CACHE.

Wenn beispielsweise eine Cachegröße von 50 gewählt wird, speichert SQL Server keine 50 Einzelwerte im Cache. Es werden nur der aktuelle Wert und die Anzahl der im Cache verbleibenden Werte zwischengespeichert. Dies bedeutet, dass die zum Speichern des Caches erforderliche Speichermenge immer zwei Instanzen des Datentyps des Sequenzobjekts beträgt.

Hinweis

Wenn die Option Cache aktiviert ist, ohne eine Cachegröße anzugeben, wählt das Datenbankmodul eine Größe aus. Benutzer sollten sich jedoch nicht darauf verlassen, dass die Auswahl konsistent ist. Microsoft kann die Methode zur Berechnung der Cachegröße ohne vorherige Ankündigung ändern.

Bei der Erstellung mit der CACHE-Option kann ein unerwartetes Herunterfahren (z. B. ein Stromausfall) zum Verlust der im Cache verbleibenden Sequenznummern führen.

Allgemeines

Sequenznummern werden außerhalb des Gültigkeitsbereichs der aktuellen Transaktion generiert. Sie werden verbraucht, unabhängig davon, ob die Transaktion, die die Sequenznummer verwendet, festgeschrieben oder zurückgesetzt wird. Die doppelte Validierung erfolgt erst, wenn ein Datensatz vollständig ausgefüllt ist. Dies kann in einigen Fällen dazu führen, dass dieselbe Nummer während der Erstellung für mehr als einen Datensatz verwendet wird, dann aber als Duplikat identifiziert wird. Wenn dies der Fall ist und andere Autonumber-Werte auf nachfolgende Datensätze angewendet wurden, kann dies zu einer Lücke zwischen den Autonumber-Werten und dem erwarteten Verhalten führen.

Cacheverwaltung

Um die Leistung zu verbessern, weist SQL Server die Anzahl der vom Argument CACHE angegebenen Sequenznummern vorab zu.

Zum Beispiel wird eine neue Sequenz mit einem Startwert von 1 und einer Cachegröße von 15 erstellt. Wenn der erste Wert benötigt wird, werden die Werte 1 bis 15 aus dem Speicher zur Verfügung gestellt. Der letzte zwischengespeicherte Wert (15) wird in die Systemtabellen auf der Festplatte geschrieben. Wenn alle 15 Nummern verwendet werden, wird der Cache bei der nächsten Anforderung (für Nummer 16) erneut zugewiesen. Der neue letzte zwischengespeicherte Wert (30) wird in die Systemtabellen geschrieben.

Wenn das Datenbankmodul gestoppt wird, nachdem Sie 22 Nummern verwendet haben, wird die nächste vorgesehene Sequenznummer im Speicher (23) in die Systemtabellen geschrieben und ersetzt die zuvor gespeicherte Nummer.

Nachdem SQL Server neu gestartet wurde und eine Sequenznummer benötigt wird, wird die Startnummer aus den Systemtabellen gelesen (23). Die Cache-Menge von 15 Zahlen (23-38) wird dem Speicher zugewiesen und die nächste Nicht-Cache-Nummer (39) wird in die Systemtabellen geschrieben.

Wenn das Datenbankmodul für ein Ereignis wie einen Stromausfall abnormal stoppt, wird die Sequenz mit der aus den Systemtabellen gelesenen Nummer neu gestartet (39). Alle Sequenznummern, die dem Speicher zugewiesen sind (aber niemals von einem Benutzer oder einer Anwendung angefordert wurden), gehen verloren. Diese Funktionalität kann Lücken hinterlassen, garantiert jedoch, dass derselbe Wert niemals zweimal für ein einzelnes Sequenzobjekt ausgegeben wird, es sei denn, er ist als ZYKLUS definiert oder wird manuell neu gestartet.

Der Cache wird im Speicher gehalten, indem der aktuelle Wert (der zuletzt ausgegebene Wert) und die Anzahl der im Cache verbleibenden Werte verfolgt werden. Daher beträgt die vom Cache verwendete Speichermenge immer zwei Instanzen des Datentyps des Sequenzobjekts.

Wenn Sie das Argument cache auf NO CACHE setzen, wird der aktuelle Sequenzwert jedes Mal in die Systemtabellen geschrieben, wenn eine Sequenz verwendet wird. Dies kann die Leistung verlangsamen, indem der Festplattenzugriff erhöht wird, verringert jedoch die Wahrscheinlichkeit unbeabsichtigter Lücken. Lücken können weiterhin auftreten, wenn Zahlen mit den Funktionen NEXT VALUE FOR oder sp_sequence_get_range angefordert werden, die Zahlen dann jedoch entweder nicht oder in nicht festgeschriebenen Transaktionen verwendet werden.

Wenn ein Sequenzobjekt die CACHE-Option verwendet, wenn Sie das Sequenzobjekt neu starten oder die Eigenschaften INCREMENT, CYCLE, MINVALUE, MAXVALUE oder cache size ändern, wird der Cache vor der Änderung in die Systemtabellen geschrieben. Dann wird der Cache beginnend mit dem aktuellen Wert neu geladen (dh es werden keine Zahlen übersprungen). Das Ändern der Cachegröße wird sofort wirksam.

CACHE-Option, wenn zwischengespeicherte Werte verfügbar sind

Der folgende Prozess wird jedes Mal ausgeführt, wenn ein Sequenzobjekt aufgefordert wird, den nächsten Wert für die CACHE-Option zu generieren, wenn im speicherinternen Cache für das Sequenzobjekt nicht verwendete Werte verfügbar sind.

  1. Der nächste Wert für das Sequenzobjekt wird berechnet.

  2. Der neue aktuelle Wert für das Sequenzobjekt wird im Speicher aktualisiert.

  3. Der berechnete Wert wird an die aufrufende Anweisung zurückgegeben.

CACHE-Option, wenn der Cache erschöpft ist

Jedes Mal, wenn ein Sequenzobjekt aufgefordert wird, den nächsten Wert für die CACHE-Option zu generieren, wenn der Cache erschöpft ist, tritt der folgende Prozess auf:

  1. Der nächste Wert für das Sequenzobjekt wird berechnet.

  2. Der letzte Wert für den neuen Cache wird berechnet.

  3. Die Systemtabellenzeile für das Sequenzobjekt ist gesperrt, und der in Schritt 2 berechnete Wert (der letzte Wert) wird in die Systemtabelle geschrieben. Ein Cache-erschöpftes xevent wird ausgelöst, um den Benutzer über den neuen persistierten Wert zu informieren.

KEINE CACHE-Option

Der folgende Prozess findet jedes Mal statt, wenn ein Sequenzobjekt aufgefordert wird, den nächsten Wert für die Option KEINE CACHE zu generieren:

  1. Der nächste Wert für das Sequenzobjekt wird berechnet.

  2. Der neue aktuelle Wert für das Sequenzobjekt wird in die Systemtabelle geschrieben.

  3. Der berechnete Wert wird an die aufrufende Anweisung zurückgegeben.

Metadaten

Informationen zu Sequenzen finden Sie in sys.Sequenz.

Sicherheit

Berechtigungen

Erfordert die Berechtigung CREATE SEQUENCE, ALTER oder CONTROL für das SCHEMA.

  • Mitglieder der festen Datenbankrollen db_owner und db_ddladmin können Sequenzobjekte erstellen, ändern und löschen.

  • Mitglieder der festen Datenbankrollen db_owner und db_datawriter können Sequenzobjekte aktualisieren, indem sie Nummern generieren.

Das folgende Beispiel gewährt dem Benutzer AdventureWorks\Larry die Berechtigung, Sequenzen im Testschema zu erstellen.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

Der Besitz eines Sequenzobjekts kann mit der Anweisung ALTER AUTHORIZATION übertragen werden.

Wenn eine Sequenz einen benutzerdefinierten Datentyp verwendet, muss der Ersteller der Sequenz über die Berechtigung REFERENCES für den Typ verfügen.

Audit

Um die SEQUENZ zu auditieren, überwachen Sie die SCHEMA_OBJECT_CHANGE_GROUP.

Beispiele

Beispiele für das Erstellen von Sequenzen und die Verwendung der Funktion NEXT VALUE FOR zum Generieren von Sequenznummern finden Sie unter Sequenznummern.

Die meisten der folgenden Beispiele erstellen Sequenzobjekte in einem Schema namens Test.

Um das Testschema zu erstellen, führen Sie die folgende Anweisung aus.

CREATE SCHEMA Test ; GO 

A. Erstellen einer Sequenz, die sich um 1 erhöht

Im folgenden Beispiel erstellt Thierry eine Sequenz mit dem Namen CountBy1, die sich bei jeder Verwendung um eins erhöht.

CREATE SEQUENCE Test.CountBy1 START WITH 1 INCREMENT BY 1 ; GO 

B. Erstellen einer Sequenz, die um 1 abnimmt

Das folgende Beispiel beginnt bei 0 und zählt bei jeder Verwendung zu negativen Zahlen um eins.

CREATE SEQUENCE Test.CountByNeg1 START WITH 0 INCREMENT BY -1 ; GO 

C. Erstellen einer Sequenz, die um 5 erhöht wird

Im folgenden Beispiel wird eine Sequenz erstellt, die bei jeder Verwendung um 5 erhöht wird.

CREATE SEQUENCE Test.CountBy1 START WITH 5 INCREMENT BY 5 ; GO 

D. Erstellen einer Sequenz, die mit einer bestimmten Nummer beginnt

Nach dem Importieren einer Tabelle stellt Thierry fest, dass die höchste verwendete ID-Nummer 24.328 ist. Thierry benötigt eine Sequenz, die Zahlen ab 24.329 generiert. Der folgende Code erstellt eine Sequenz, die mit 24.329 beginnt und um 1 erhöht wird.

CREATE SEQUENCE Test.ID_Seq START WITH 24329 INCREMENT BY 1 ; GO 

E. Erstellen einer Sequenz mit Standardwerten

Das folgende Beispiel erstellt eine Sequenz mit den Standardwerten.

CREATE SEQUENCE Test.TestSequence ; 

Führen Sie die folgende Anweisung aus, um die Eigenschaften der Sequenz anzuzeigen.

SELECT * FROM sys.sequences WHERE name = 'TestSequence' ; 

Eine unvollständige Liste der Ausgabe zeigt die Standardwerte.

Output Default value
start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. Erstellen einer Sequenz mit einem bestimmten Datentyp

Im folgenden Beispiel wird eine Sequenz mit dem Datentyp smallint mit einem Bereich von -32.768 bis 32.767 erstellt.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. Erstellen einer Sequenz mit allen Argumenten

Das folgende Beispiel erstellt eine Sequenz mit dem Namen DecSeq unter Verwendung des Datentyps decimal mit einem Bereich von 0 bis 255. Die Sequenz beginnt mit 125 und wird jedes Mal um 25 erhöht, wenn eine Zahl generiert wird. Da die Sequenz so konfiguriert ist, dass sie zyklisch ausgeführt wird, wenn der Wert den Maximalwert von 200 überschreitet, wird die Sequenz mit dem Minimalwert von 100 neu gestartet.

CREATE SEQUENCE Test.DecSeq AS decimal(3,0) START WITH 125 INCREMENT BY 25 MINVALUE 100 MAXVALUE 200 CYCLE CACHE 3 ; 

Führen Sie die folgende Anweisung aus, um den ersten Wert zu sehen; die START WITH Option von 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

Führen Sie die Anweisung noch dreimal aus, um 150, 175 und 200 zurückzugeben.

Führen Sie die Anweisung erneut aus, um zu sehen, wie der Startwert zur MINVALUE Option 100 zurückkehrt.

Führen Sie den folgenden Code aus, um die Cachegröße zu bestätigen und den aktuellen Wert anzuzeigen.

SELECT cache_size, current_value FROM sys.sequences WHERE name = 'DecSeq' ; 

Siehe auch

SEQUENZ ÄNDERN (Transact-SQL)
SEQUENZ LÖSCHEN (Transact-SQL)
NÄCHSTER WERT FÜR (Transact-SQL)
Sequenznummern

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.