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. Sekwencja jest zdefiniowanym przez użytkownika obiektem związanym ze schematem, który generuje sekwencję wartości liczbowych zgodnie ze specyfikacją, z którą sekwencja została utworzona. Sekwencja wartości liczbowych jest generowana w porządku rosnącym lub malejącym w określonym przedziale i może być skonfigurowana do ponownego uruchomienia (cyklu) po wyczerpaniu. Sekwencje, w przeciwieństwie do kolumn tożsamości, nie są powiązane z konkretnymi tabelami. Aplikacje odnoszą się do obiektu sekwencji, aby pobrać jego następną wartość. Zależność między sekwencjami i tabelami jest kontrolowana przez aplikację. Aplikacje użytkownika mogą odwoływać się do obiektu sekwencji i koordynować wartości w wielu wierszach i tabelach.

w przeciwieństwie do wartości kolumn tożsamości, które są generowane podczas wstawiania wierszy, aplikacja może uzyskać następny numer sekwencji bez wstawiania wiersza, wywołując następną wartość dla funkcji. Użyj sp_sequence_get_range, aby uzyskać wiele numerów sekwencyjnych jednocześnie.

informacje i scenariusze, które używają zarówno sekwencji tworzenia, jak i następnej wartości funkcji, zobacz numery sekwencji.

ikona odnośnika do tematu konwencje składni Transact-SQL

składnia

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

Uwaga

aby wyświetlić składnię Transact-SQL dla SQL Server 2014 i wcześniejszych, zobacz dokumentację poprzednich wersji.

argumenty

sequence_name
określa unikalną nazwę, pod którą sekwencja jest znana w bazie danych. Typ to sysname.

określa granice dla obiektu sequence. Domyślną minimalną wartością dla nowego obiektu sequence jest minimalna wartość typu danych obiektu sequence. Jest to zero dla typu danych tinyint i liczba ujemna dla wszystkich innych typów danych.

właściwość określająca, czy obiekt sekwencji powinien ponownie uruchomić się od wartości minimalnej (lub maksimum dla malejących obiektów sekwencji) lub wyrzucić wyjątek, gdy jego minimalna lub maksymalna wartość zostanie przekroczona. Domyślną opcją cyklu dla nowych obiektów sekwencji jest brak cyklu.

Uwaga

cykle Sekwencja uruchamia się ponownie od wartości minimalnej lub maksymalnej, a nie od wartości początkowej.

| NO CACHE ]
zwiększa wydajność aplikacji, które używają obiektów sekwencji, minimalizując liczbę dysków wymaganych do generowania numerów sekwencji. Domyślnie pamięć podręczna.

na przykład, jeśli wybrano rozmiar pamięci podręcznej 50, SQL Server nie przechowuje 50 pojedynczych wartości w pamięci podręcznej. Buforuje tylko bieżącą wartość i liczbę wartości pozostałych w buforze. Oznacza to, że ilość pamięci wymaganej do przechowywania pamięci podręcznej to zawsze dwie instancje typu danych obiektu sequence.

Uwaga

Jeśli opcja cache jest włączona bez określania rozmiaru cache, silnik bazy danych wybierze rozmiar. Użytkownicy nie powinni jednak polegać na tym, że wybór jest spójny. Firma Microsoft może zmienić metodę obliczania rozmiaru pamięci podręcznej bez powiadomienia.

podczas tworzenia z opcją pamięci podręcznej nieoczekiwane wyłączenie (takie jak awaria zasilania) może spowodować utratę numerów sekwencji pozostałych w pamięci podręcznej.

Uwagi ogólne

numery sekwencji są generowane poza zakresem bieżącej transakcji. Są one wykorzystywane niezależnie od tego, czy transakcja z użyciem numeru sekwencyjnego jest zatwierdzona, czy wycofana. Duplikat walidacji następuje tylko wtedy, gdy rekord jest w pełni wypełniony. Może to skutkować w niektórych przypadkach, gdy ten sam numer jest używany dla więcej niż jednego rekordu podczas tworzenia, ale zostanie zidentyfikowany jako DUPLIKAT. Jeśli to nastąpi i inne wartości liczb autonumber zostaną zastosowane do kolejnych rekordów, może to spowodować przerwę między wartościami liczb autonumber a oczekiwanym zachowaniem.

zarządzanie pamięcią podręczną

aby poprawić wydajność, SQL Server wstępnie przydziela liczbę liczb sekwencji określoną przez argument CACHE.

na przykład, nowa sekwencja jest tworzona z wartością początkową 1 i rozmiarem pamięci podręcznej 15. Gdy potrzebna jest pierwsza wartość, wartości od 1 do 15 są udostępniane z pamięci. Ostatnia wartość buforowana (15) jest zapisywana do tabel systemowych na dysku. Gdy wszystkie 15 liczb zostanie użyte, następne żądanie (dla liczby 16) spowoduje ponowne przydzielenie pamięci podręcznej. Nowa ostatnia wartość buforowana (30) zostanie zapisana do tabel systemowych.

Jeśli silnik bazy danych zostanie zatrzymany po użyciu 22 liczb, następny zamierzony numer sekwencyjny w pamięci (23) zostanie zapisany do tabel systemowych, zastępując wcześniej zapisany numer.

Po ponownym uruchomieniu SQL Server i konieczności podania numeru porządkowego, numer startowy jest odczytywany z tabel systemowych (23). Ilość pamięci podręcznej 15 liczb (23-38) jest przydzielana do pamięci, a następny numer bez pamięci podręcznej (39) jest zapisywany do tabel systemowych.

Jeśli silnik bazy danych zatrzyma się nieprawidłowo w przypadku zdarzenia, takiego jak awaria zasilania, Sekwencja uruchamia się ponownie z liczbą odczytaną z tabel systemowych (39). Wszelkie numery sekwencyjne przydzielone do pamięci (ale nigdy nie żądane przez użytkownika lub aplikację) są tracone. Ta funkcjonalność może pozostawiać luki, ale gwarantuje, że ta sama wartość Nigdy nie zostanie wydana dwa razy dla pojedynczego obiektu sekwencji, chyba że zostanie zdefiniowana jako cykl lub zostanie ręcznie uruchomiona ponownie.

pamięć podręczna jest utrzymywana w pamięci poprzez śledzenie bieżącej wartości (ostatniej wystawionej wartości) i liczby wartości pozostawionych w pamięci podręcznej. Dlatego ilość pamięci użytej przez cache jest zawsze dwiema instancjami typu danych obiektu sequence.

ustawienie argumentu cache NA NO CACHE zapisuje bieżącą wartość sekwencji do tabel systemowych za każdym razem, gdy używana jest sekwencja. Może to spowolnić wydajność poprzez zwiększenie dostępu do dysku, ale zmniejsza ryzyko niezamierzonych przerw. Luki mogą nadal występować, jeśli liczby są wymagane przy użyciu następnej wartości dla funkcji or sp_sequence_get_range, ale wtedy liczby nie są używane lub są używane w niezaangażowanych transakcjach.

gdy obiekt sekwencji używa opcji CACHE, jeśli ponownie uruchomisz obiekt sekwencji lub zmienisz właściwości INCREMENT, CYCLE, MINVALUE, MAXVALUE lub rozmiar bufora, spowoduje to zapisanie bufora do tabel systemowych przed dokonaniem zmiany. Następnie pamięć podręczna jest przeładowywana zaczynając od bieżącej wartości (tzn. żadne liczby nie są pomijane). Zmiana rozmiaru pamięci podręcznej jest natychmiastowa.

opcja CACHE gdy dostępne są wartości Cache

następujący proces zachodzi za każdym razem, gdy obiekt sequence jest żądany do wygenerowania następnej wartości dla opcji CACHE, jeśli w pamięci podręcznej są nieużywane wartości dla obiektu sequence.

  1. obliczana jest następna wartość dla obiektu sequence.

  2. Nowa bieżąca wartość dla obiektu sequence zostanie zaktualizowana w pamięci.

  3. obliczona wartość zostanie zwrócona do instrukcji wywołania.

opcja pamięci podręcznej gdy pamięć podręczna jest wyczerpana

następujący proces zachodzi za każdym razem, gdy obiekt sekwencji jest żądany do wygenerowania następnej wartości dla opcji pamięci podręcznej, jeśli pamięć podręczna została wyczerpana:

  1. obliczana jest następna wartość dla obiektu sekwencji.

  2. obliczana jest ostatnia wartość nowego bufora.

  3. wiersz tabeli systemowej dla obiektu sequence zostanie zablokowany, a wartość obliczona w Kroku 2 (ostatnia wartość) zostanie zapisana do tabeli systemowej. Uruchamiany jest XEvent wyczerpany pamięcią podręczną, aby powiadomić użytkownika o nowej trwałej wartości.

brak opcji CACHE

następujący proces zachodzi za każdym razem, gdy obiekt sequence jest żądany do wygenerowania następnej wartości dla opcji NO CACHE:

  1. obliczana jest następna wartość dla obiektu sequence.

  2. Nowa bieżąca wartość dla obiektu sequence zostanie zapisana do tabeli systemowej.

  3. obliczona wartość zostanie zwrócona do instrukcji wywołania.

metadane

informacje o sekwencjach, sys zapytań.sekwencje.

bezpieczeństwo

uprawnienia

wymaga utworzenia sekwencji, zmiany lub kontroli uprawnień na schemacie.

  • członkowie stałych ról baz danych db_owner i db_ddladmin mogą tworzyć, zmieniać i upuszczać obiekty sekwencji.

  • członkowie stałych ról baz danych db_owner i db_datawriter mogą aktualizować obiekty sekwencji, powodując ich generowanie liczb.

poniższy przykład daje użytkownikowi prawo do tworzenia sekwencji w schemacie testowym.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

własność obiektu sekwencji może zostać przeniesiona za pomocą instrukcji ALTER AUTHORIZATION.

Jeśli Sekwencja używa zdefiniowanego przez użytkownika typu danych, Twórca sekwencji musi mieć uprawnienia odniesienia do tego typu.

Audit

aby auditować tworzenie sekwencji, monitoruj SCHEMA_OBJECT_CHANGE_GROUP.

przykłady

przykłady tworzenia sekwencji i używania następnej wartości funkcji do generowania numerów sekwencji, patrz numery sekwencji.

większość z poniższych przykładów tworzy obiekty sekwencji w schemacie o nazwie Test.

aby utworzyć schemat testowy, wykonaj następujące polecenie.

CREATE SCHEMA Test ; GO 

A. tworzenie sekwencji zwiększającej się o 1

w poniższym przykładzie Thierry tworzy sekwencję o nazwie CountBy1, która zwiększa się o jeden za każdym razem, gdy jest używana.

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

B. tworzenie sekwencji, która zmniejsza się o 1

poniższy przykład zaczyna się od 0 i liczy się do liczb ujemnych o jeden za każdym razem, gdy jest używany.

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

C. Tworzenie sekwencji, która zwiększa się o 5

poniższy przykład tworzy sekwencję, która zwiększa się o 5 za każdym razem, gdy jest używana.

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

D. tworzenie sekwencji rozpoczynającej się od wyznaczonej liczby

Po zaimportowaniu tabeli, Thierry zauważa, że najwyższy użyty numer ID to 24,328. Thierry potrzebuje sekwencji, która wygeneruje liczby zaczynające się od 24,329. Poniższy kod tworzy sekwencję, która zaczyna się od 24,329 i zwiększa się o 1.

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

E. Tworzenie sekwencji przy użyciu wartości domyślnych

poniższy przykład tworzy sekwencję przy użyciu wartości domyślnych.

CREATE SEQUENCE Test.TestSequence ; 

wykonaj następujące polecenie, aby wyświetlić właściwości sekwencji.

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

częściowa lista wyników pokazuje wartości domyślne.

current_value

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

F. tworzenie sekwencji o określonym typie danych

poniższy przykład tworzy sekwencję przy użyciu typu danych smallint, z zakresem od -32,768 do 32,767.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. tworzenie sekwencji przy użyciu wszystkich argumentów

poniższy przykład tworzy sekwencję o nazwie DecSeq przy użyciu typu danych dziesiętnych, o zakresie od 0 do 255. Sekwencja zaczyna się od 125 i zwiększa się o 25 za każdym razem, gdy liczba jest generowana. Ponieważ sekwencja jest skonfigurowana do przełączania, gdy wartość przekracza maksymalną wartość 200, Sekwencja uruchamia się ponownie przy minimalnej wartości 100.

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

wykonaj następujące polecenie, aby zobaczyć pierwszą wartość;START WITH opcja 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

wykonaj polecenie jeszcze trzy razy, aby zwrócić 150, 175 i 200.

wykonaj polecenie ponownie, aby zobaczyć, jak wartość początkowa wraca do opcji MINVALUE 100.

wykonaj poniższy kod, aby potwierdzić rozmiar bufora i zobaczyć bieżącą wartość.

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

Zobacz także

ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL)
Następna wartość dla (Transact-SQL)
numery sekwencji

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.