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. Une séquence est un objet lié au schéma défini par l’utilisateur qui génère une séquence de valeurs numériques selon la spécification avec laquelle la séquence a été créée. La séquence de valeurs numériques est générée dans un ordre croissant ou décroissant à un intervalle défini et peut être configurée pour redémarrer (cycle) une fois épuisée. Les séquences, contrairement aux colonnes d’identité, ne sont pas associées à des tables spécifiques. Les applications font référence à un objet de séquence pour récupérer sa valeur suivante. La relation entre les séquences et les tables est contrôlée par l’application. Les applications utilisateur peuvent référencer un objet séquence et coordonner les valeurs sur plusieurs lignes et tables.

Contrairement aux valeurs de colonnes d’identité générées lors de l’insertion de lignes, une application peut obtenir le numéro de séquence suivant sans insérer la ligne en appelant la VALEUR SUIVANTE POUR la fonction. Utilisez sp_sequence_get_range pour obtenir plusieurs numéros de séquence à la fois.

Pour des informations et des scénarios qui utilisent à la fois CREATE SEQUENCE et la VALEUR SUIVANTE POUR la fonction, voir Numéros de séquence.

Icône de lien de rubriqueConventions de syntaxe Transact-SQL

Syntaxe

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

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 et versions antérieures, consultez la documentation des versions précédentes.

Arguments

sequence_name
Spécifie le nom unique sous lequel la séquence est connue dans la base de données. Le type est sysname.

Spécifie les limites de l’objet séquence. La valeur minimale par défaut pour un nouvel objet sequence est la valeur minimale du type de données de l’objet sequence. Il s’agit de zéro pour le type de données tinyint et d’un nombre négatif pour tous les autres types de données.

Propriété qui spécifie si l’objet de séquence doit redémarrer à partir de la valeur minimale (ou maximale pour les objets de séquence descendants) ou lancer une exception lorsque sa valeur minimale ou maximale est dépassée. L’option de cycle par défaut pour les nouveaux objets de séquence est NO CYCLE.

Remarque

Le cycle d’une SÉQUENCE redémarre à partir de la valeur minimale ou maximale, et non à partir de la valeur de départ.

/PAS de CACHE]
Augmente les performances des applications qui utilisent des objets de séquence en minimisant le nombre d’iOS de disque requis pour générer des numéros de séquence. La valeur par défaut est CACHE.

Par exemple, si une taille de cache de 50 est choisie, SQL Server ne conserve pas 50 valeurs individuelles en cache. Il met uniquement en cache la valeur actuelle et le nombre de valeurs restantes dans le cache. Cela signifie que la quantité de mémoire requise pour stocker le cache est toujours deux instances du type de données de l’objet séquence.

Remarque

Si l’option cache est activée sans spécifier de taille de cache, le moteur de base de données sélectionnera une taille. Cependant, les utilisateurs ne doivent pas se fier à la cohérence de la sélection. Microsoft peut modifier la méthode de calcul de la taille du cache sans préavis.

Lorsqu’il est créé avec l’option CACHE, un arrêt inattendu (comme une panne de courant) peut entraîner la perte des numéros de séquence restant dans le cache.

Remarques générales

Les numéros de séquence sont générés en dehors de la portée de la transaction en cours. Ils sont consommés que la transaction utilisant le numéro de séquence soit validée ou annulée. La validation en double ne se produit qu’une fois qu’un enregistrement est entièrement rempli. Cela peut entraîner dans certains cas où le même numéro est utilisé pour plus d’un enregistrement lors de la création, mais est ensuite identifié comme un duplicata. Si cela se produit et que d’autres valeurs de numérotation automatique ont été appliquées aux enregistrements suivants, cela peut entraîner un écart entre les valeurs de numérotation automatique et le comportement attendu.

Gestion du cache

Pour améliorer les performances, SQL Server pré-alloue le nombre de numéros de séquence spécifiés par l’argument CACHE.

Pour un exemple, une nouvelle séquence est créée avec une valeur de départ de 1 et une taille de cache de 15. Lorsque la première valeur est nécessaire, les valeurs 1 à 15 sont disponibles en mémoire. La dernière valeur mise en cache (15) est écrite dans les tables système du disque. Lorsque les 15 numéros sont utilisés, la requête suivante (pour le numéro 16) entraînera une nouvelle allocation du cache. La nouvelle dernière valeur mise en cache (30) sera écrite dans les tables système.

Si le moteur de base de données est arrêté après avoir utilisé 22 numéros, le prochain numéro de séquence prévu en mémoire (23) est écrit dans les tables système, en remplacement du numéro précédemment stocké.

Une fois que SQL Server redémarre et qu’un numéro de séquence est nécessaire, le numéro de départ est lu dans les tables système (23). La quantité de cache de 15 nombres (23-38) est allouée à la mémoire et le numéro sans cache suivant (39) est écrit dans les tables système.

Si le Moteur de base de données s’arrête anormalement pour un événement tel qu’une panne de courant, la séquence redémarre avec le numéro lu dans les tables système (39). Tous les numéros de séquence alloués à la mémoire (mais jamais demandés par un utilisateur ou une application) sont perdus. Cette fonctionnalité peut laisser des lacunes, mais garantit que la même valeur ne sera jamais émise deux fois pour un seul objet sequence, sauf si elle est définie comme CYCLE ou si elle est redémarrée manuellement.

Le cache est maintenu en mémoire en suivant la valeur actuelle (la dernière valeur émise) et le nombre de valeurs restantes dans le cache. Par conséquent, la quantité de mémoire utilisée par le cache est toujours deux instances du type de données de l’objet séquence.

Définir l’argument cache sur NO CACHE écrit la valeur de la séquence actuelle dans les tables système chaque fois qu’une séquence est utilisée. Cela peut ralentir les performances en augmentant l’accès au disque, mais réduit le risque de lacunes involontaires. Des lacunes peuvent toujours se produire si des nombres sont demandés à l’aide de la VALEUR SUIVANTE POUR les fonctions sp_sequence_get_range ou sp_sequence_get_range, mais que les nombres ne sont pas utilisés ou sont utilisés dans des transactions non validées.

Lorsqu’un objet de séquence utilise l’option CACHE, si vous redémarrez l’objet de séquence ou modifiez les propriétés INCRÉMENT, CYCLE, MINVALUE, MAXVALUE ou la taille du cache, cela entraînera l’écriture du cache dans les tables système avant que la modification ne se produise. Ensuite, le cache est rechargé en commençant par la valeur actuelle (c’est-à-dire qu’aucun nombre n’est ignoré). La modification de la taille du cache prend effet immédiatement.

Option de CACHE lorsque des valeurs mises en cache sont disponibles

Le processus suivant se produit chaque fois qu’un objet de séquence est demandé pour générer la valeur suivante pour l’option de CACHE s’il existe des valeurs inutilisées disponibles dans le cache en mémoire pour l’objet de séquence.

  1. La valeur suivante de l’objet séquence est calculée.

  2. La nouvelle valeur courante de l’objet sequence est mise à jour en mémoire.

  3. La valeur calculée est renvoyée à l’instruction d’appel.

Option de CACHE lorsque le cache est épuisé

Le processus suivant se produit chaque fois qu’un objet de séquence est demandé pour générer la valeur suivante pour l’option de CACHE si le cache a été épuisé :

  1. La valeur suivante pour l’objet de séquence est calculée.

  2. La dernière valeur du nouveau cache est calculée.

  3. La ligne de la table système pour l’objet séquence est verrouillée et la valeur calculée à l’étape 2 (la dernière valeur) est écrite dans la table système. Un xevent épuisé par le cache est déclenché pour informer l’utilisateur de la nouvelle valeur persistante.

AUCUNE option de CACHE

Le processus suivant se produit chaque fois qu’un objet de séquence est demandé pour générer la valeur suivante pour l’option SANS CACHE :

  1. La valeur suivante pour l’objet de séquence est calculée.

  2. La nouvelle valeur courante de l’objet sequence est écrite dans la table système.

  3. La valeur calculée est renvoyée à l’instruction d’appel.

Métadonnées

Pour obtenir des informations sur les séquences, interrogez sys.séquence.

Sécurité

Autorisations

Nécessite une autorisation de CRÉATION DE SÉQUENCE, de MODIFICATION ou de CONTRÔLE sur le SCHÉMA.

  • Les membres des rôles de base de données fixes db_owner et db_ddladmin peuvent créer, modifier et supprimer des objets de séquence.

  • Les membres des rôles de base de données fixes db_owner et db_datawriter peuvent mettre à jour les objets de séquence en les obligeant à générer des nombres.

L’exemple suivant autorise l’utilisateur AdventureWorks\Larry à créer des séquences dans le schéma de test.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

La propriété d’un objet de séquence peut être transférée à l’aide de l’instruction ALTER AUTHORIZATION.

Si une séquence utilise un type de données défini par l’utilisateur, le créateur de la séquence doit avoir l’autorisation REFERENCES sur le type.

Audit

Pour auditer LA SÉQUENCE DE CRÉATION, surveillez le SCHEMA_OBJECT_CHANGE_GROUP.

Exemples

Pour des exemples de création de séquences et d’utilisation de la VALEUR SUIVANTE DE la fonction pour générer des numéros de séquence, voir Numéros de séquence.

La plupart des exemples suivants créent des objets de séquence dans un schéma nommé Test.

Pour créer le schéma de test, exécutez l’instruction suivante.

CREATE SCHEMA Test ; GO 

A. Création d’une séquence qui augmente de 1

Dans l’exemple suivant, Thierry crée une séquence nommée CountBy1 qui augmente de un chaque fois qu’elle est utilisée.

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

B. Création d’une séquence qui diminue de 1

L’exemple suivant commence à 0 et compte en nombres négatifs de un chaque fois qu’il est utilisé.

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

C. Création d’une séquence qui augmente de 5

L’exemple suivant crée une séquence qui augmente de 5 chaque fois qu’elle est utilisée.

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

D. Création d’une séquence qui commence par un numéro désigné

Après avoir importé une table, Thierry remarque que le numéro d’identification le plus élevé utilisé est 24 328. Thierry a besoin d’une séquence qui générera des nombres à partir de 24 329. Le code suivant crée une séquence qui commence par 24 329 et s’incrémente de 1.

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

E. Création d’une séquence à l’aide des valeurs par défaut

L’exemple suivant crée une séquence à l’aide des valeurs par défaut.

CREATE SEQUENCE Test.TestSequence ; 

Exécutez l’instruction suivante pour afficher les propriétés de la séquence.

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

Une liste partielle de la sortie montre les valeurs par défaut.

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

F. Création d’une séquence avec un type de données spécifique

L’exemple suivant crée une séquence utilisant le type de données smallint, avec une plage de -32 768 à 32 767.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. Création d’une séquence en utilisant tous les arguments

L’exemple suivant crée une séquence nommée DecSeq en utilisant le type de données décimales, ayant une plage de 0 à 255. La séquence commence par 125 et s’incrémente de 25 chaque fois qu’un nombre est généré. Étant donné que la séquence est configurée pour faire un cycle lorsque la valeur dépasse la valeur maximale de 200, la séquence redémarre à la valeur minimale de 100.

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

Exécutez l’instruction suivante pour voir la première valeur ; l’option START WITH de 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

Exécutez l’instruction trois fois de plus pour renvoyer 150, 175 et 200.

Exécutez à nouveau l’instruction pour voir comment la valeur de démarrage revient à l’option MINVALUE de 100.

Exécutez le code suivant pour confirmer la taille du cache et voir la valeur actuelle.

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

Voir Aussi

MODIFIER LA SÉQUENCE (Transact-SQL)
DÉPOSER LA SÉQUENCE (Transact-SQL)
VALEUR SUIVANTE POUR (Transact-SQL)
Numéros de séquence

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.