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. Una sequenza è un oggetto associato a schema definito dall’utente che genera una sequenza di valori numerici in base alla specifica con cui è stata creata la sequenza. La sequenza di valori numerici viene generata in ordine crescente o decrescente a un intervallo definito e può essere configurata per il riavvio (ciclo) una volta esaurita. Le sequenze, a differenza delle colonne di identità, non sono associate a tabelle specifiche. Le applicazioni fanno riferimento a un oggetto sequenza per recuperare il valore successivo. La relazione tra sequenze e tabelle è controllata dall’applicazione. Le applicazioni utente possono fare riferimento a un oggetto sequenza e coordinare i valori su più righe e tabelle.

A differenza dei valori delle colonne di identità generati quando vengono inserite le righe, un’applicazione può ottenere il numero di sequenza successivo senza inserire la riga chiamando il VALORE SUCCESSIVO PER LA funzione. Usa sp_sequence_get_range per ottenere più numeri di sequenza contemporaneamente.

Per informazioni e scenari che utilizzano sia CREA SEQUENZA che il VALORE SUCCESSIVO PER LA funzione, vedere Numeri di sequenza.

Icona collegamento argomentoConvenzioni di sintassi Transact-SQL

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, consultare la documentazione delle versioni precedenti.

Argomenti

sequence_name
Specifica il nome univoco con cui la sequenza è nota nel database. Il tipo è sysname.

Specifica i limiti per l’oggetto sequenza. Il valore minimo predefinito per un nuovo oggetto sequenza è il valore minimo del tipo di dati dell’oggetto sequenza. Questo è zero per il tipo di dati tinyint e un numero negativo per tutti gli altri tipi di dati.

Proprietà che specifica se l’oggetto sequenza deve essere riavviato dal valore minimo (o massimo per gli oggetti sequenza discendente) o generare un’eccezione quando viene superato il valore minimo o massimo. L’opzione ciclo predefinito per i nuovi oggetti sequenza è NESSUN CICLO.

Nota

Il ciclo di una SEQUENZA viene riavviato dal valore minimo o massimo, non dal valore iniziale.

/ NO CACHE]
Aumenta le prestazioni per le applicazioni che utilizzano oggetti sequenza riducendo al minimo il numero di disco iOS necessari per generare numeri di sequenza. Il valore predefinito è CACHE.

Ad esempio, se viene scelta una dimensione della cache di 50, SQL Server non mantiene 50 singoli valori nella cache. Memorizza solo il valore corrente e il numero di valori rimasti nella cache. Ciò significa che la quantità di memoria necessaria per memorizzare la cache è sempre due istanze del tipo di dati dell’oggetto sequenza.

Nota

Se l’opzione cache è abilitata senza specificare una dimensione della cache, il Motore di database selezionerà una dimensione. Tuttavia, gli utenti non dovrebbero fare affidamento sulla coerenza della selezione. Microsoft potrebbe modificare il metodo di calcolo della dimensione della cache senza preavviso.

Quando viene creato con l’opzione CACHE, un arresto imprevisto (come un’interruzione di corrente) può causare la perdita di numeri di sequenza rimanenti nella cache.

Note generali

I numeri di sequenza vengono generati al di fuori dell’ambito della transazione corrente. Vengono utilizzati se la transazione utilizzando il numero di sequenza è impegnata o ripristinata. La convalida duplicata si verifica solo una volta che un record è completamente popolato. Ciò può comportare in alcuni casi in cui lo stesso numero viene utilizzato per più di un record durante la creazione, ma viene identificato come duplicato. Se ciò si verifica e altri valori di numero automatico sono stati applicati ai record successivi, ciò può comportare un intervallo tra i valori di numero automatico e il comportamento previsto.

Gestione cache

Per migliorare le prestazioni, SQL Server pre-alloca il numero di numeri di sequenza specificati dall’argomento CACHE.

Ad esempio, viene creata una nuova sequenza con un valore iniziale di 1 e una dimensione della cache di 15. Quando è necessario il primo valore, i valori da 1 a 15 vengono resi disponibili dalla memoria. L’ultimo valore memorizzato nella cache (15) viene scritto nelle tabelle di sistema sul disco. Quando vengono utilizzati tutti i 15 numeri, la richiesta successiva (per il numero 16) farà sì che la cache venga allocata di nuovo. Il nuovo ultimo valore memorizzato nella cache (30) verrà scritto nelle tabelle di sistema.

Se il motore di database viene arrestato dopo aver utilizzato 22 numeri, il successivo numero di sequenza previsto in memoria (23) viene scritto nelle tabelle di sistema, sostituendo il numero precedentemente memorizzato.

Dopo il riavvio di SQL Server ed è necessario un numero di sequenza, il numero iniziale viene letto dalle tabelle di sistema (23). La quantità di cache di 15 numeri (23-38) viene allocata alla memoria e il successivo numero non cache (39) viene scritto nelle tabelle di sistema.

Se il motore di database si arresta in modo anomalo per un evento come un’interruzione di corrente, la sequenza viene riavviata con il numero letto dalle tabelle di sistema (39). Tutti i numeri di sequenza allocati in memoria (ma mai richiesti da un utente o un’applicazione) vengono persi. Questa funzionalità può lasciare spazi vuoti, ma garantisce che lo stesso valore non verrà mai emesso due volte per un singolo oggetto sequenza a meno che non sia definito come CICLO o venga riavviato manualmente.

La cache viene mantenuta in memoria tracciando il valore corrente (l’ultimo valore emesso) e il numero di valori rimasti nella cache. Pertanto, la quantità di memoria utilizzata dalla cache è sempre due istanze del tipo di dati dell’oggetto sequenza.

L’impostazione dell’argomento cache su NESSUNA CACHE scrive il valore della sequenza corrente nelle tabelle di sistema ogni volta che viene utilizzata una sequenza. Ciò potrebbe rallentare le prestazioni aumentando l’accesso al disco, ma riduce la possibilità di lacune indesiderate. Le lacune possono ancora verificarsi se i numeri vengono richiesti utilizzando il VALORE SUCCESSIVO PER le funzioni sp_sequence_get_range, ma i numeri non vengono utilizzati o vengono utilizzati nelle transazioni senza commit.

Quando un oggetto sequenza utilizza l’opzione CACHE, se si riavvia l’oggetto sequenza o si modificano le proprietà INCREMENTO, CICLO, MINVALUE, MAXVALUE o dimensione cache, la cache verrà scritta nelle tabelle di sistema prima che si verifichi la modifica. Quindi la cache viene ricaricata a partire dal valore corrente (cioè nessun numero viene saltato). La modifica della dimensione della cache ha effetto immediato.

Opzione CACHE quando i valori memorizzati nella cache sono disponibili

Il seguente processo si verifica ogni volta che un oggetto sequenza viene richiesto di generare il valore successivo per l’opzione CACHE se ci sono valori inutilizzati disponibili nella cache in memoria per l’oggetto sequenza.

  1. Viene calcolato il valore successivo per l’oggetto sequenza.

  2. Il nuovo valore corrente per l’oggetto sequenza viene aggiornato in memoria.

  3. Il valore calcolato viene restituito all’istruzione chiamante.

Opzione CACHE quando la cache è esaurita

Il seguente processo si verifica ogni volta che un oggetto sequenza viene richiesto di generare il valore successivo per l’opzione CACHE se la cache è stata esaurita:

  1. Viene calcolato il valore successivo per l’oggetto sequenza.

  2. Viene calcolato l’ultimo valore per la nuova cache.

  3. La riga della tabella di sistema per l’oggetto sequenza è bloccata e il valore calcolato nel passaggio 2 (l’ultimo valore) viene scritto nella tabella di sistema. Viene attivato un xevent esaurito dalla cache per notificare all’utente il nuovo valore persistente.

NESSUNA opzione CACHE

Il seguente processo si verifica ogni volta che viene richiesto a un oggetto sequenza di generare il valore successivo per l’opzione NESSUNA CACHE:

  1. Viene calcolato il valore successivo per l’oggetto sequenza.

  2. Il nuovo valore corrente per l’oggetto sequenza viene scritto nella tabella di sistema.

  3. Il valore calcolato viene restituito all’istruzione chiamante.

Metadati

Per informazioni sulle sequenze, interrogare sys.sequenza.

Sicurezza

Autorizzazioni

Richiede CREARE SEQUENZA, MODIFICARE o CONTROLLARE le autorizzazioni sullo SCHEMA.

  • I membri dei ruoli di database fissi db_owner e db_ddladmin possono creare, modificare e rilasciare oggetti di sequenza.

  • I membri dei ruoli di database fissi db_owner e db_datawriter possono aggiornare gli oggetti sequenza facendoli generare numeri.

Il seguente esempio concede all’utente AdventureWorks\Larry il permesso di creare sequenze nello schema di Test.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

La proprietà di un oggetto sequenza può essere trasferita utilizzando l’istruzione ALTER AUTHORIZATION.

Se una sequenza utilizza un tipo di dati definito dall’utente, il creatore della sequenza deve disporre dell’autorizzazione REFERENCES sul tipo.

Audit

Per verificare LA SEQUENZA DI CREAZIONE, monitorare SCHEMA_OBJECT_CHANGE_GROUP.

Esempi

Per esempi di creazione di sequenze e utilizzo del VALORE SUCCESSIVO PER la funzione per generare numeri di sequenza, vedere Numeri di sequenza.

La maggior parte degli esempi seguenti crea oggetti sequenza in uno schema denominato Test.

Per creare lo schema di test, eseguire la seguente istruzione.

CREATE SCHEMA Test ; GO 

A. Creazione di una sequenza che aumenta di 1

Nell’esempio seguente, Thierry crea una sequenza denominata CountBy1 che aumenta di uno ogni volta che viene utilizzata.

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

B. Creazione di una sequenza che diminuisce di 1

Il seguente esempio inizia da 0 e conta in numeri negativi di uno ogni volta che viene utilizzato.

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

C. Creazione di una sequenza che aumenta di 5

L’esempio seguente crea una sequenza che aumenta di 5 ogni volta che viene utilizzata.

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

D. Creazione di una sequenza che inizia con un numero designato

Dopo aver importato una tabella, Thierry nota che il numero ID più alto utilizzato è 24.328. Thierry ha bisogno di una sequenza che genererà numeri a partire da 24.329. Il codice seguente crea una sequenza che inizia con 24.329 e aumenta di 1.

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

E. Creazione di una sequenza utilizzando i valori predefiniti

Il seguente esempio crea una sequenza utilizzando i valori predefiniti.

CREATE SEQUENCE Test.TestSequence ; 

Eseguire la seguente istruzione per visualizzare le proprietà della sequenza.

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

Un elenco parziale dell’output mostra i valori predefiniti.

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

F. Creazione di una sequenza con un tipo di dati specifico

L’esempio seguente crea una sequenza utilizzando il tipo di dati smallint, con un range da-32.768 a 32.767.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. Creazione di una sequenza utilizzando tutti gli argomenti

Il seguente esempio crea una sequenza denominata DecSeq utilizzando il tipo di dati decimali, con un intervallo da 0 a 255. La sequenza inizia con 125 e aumenta di 25 ogni volta che viene generato un numero. Poiché la sequenza è configurata per il ciclo quando il valore supera il valore massimo di 200, la sequenza viene riavviata al valore minimo di 100.

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

Eseguire la seguente istruzione per vedere il primo valore; l’opzione START WITH di 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

Eseguire l’istruzione altre tre volte per restituire 150, 175 e 200.

Esegui di nuovo l’istruzione per vedere come il valore iniziale torna all’opzioneMINVALUE di 100.

Eseguire il seguente codice per confermare la dimensione della cache e vedere il valore corrente.

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

Vedere anche

ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE(Transact-SQL)
NEXT VALUE FOR (Transact-SQL)
Sequence Numbers

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.