Partager via


CRÉER SÉQUENCE (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de données SQL dans Microsoft Fabric

Crée un objet séquence et spécifie ses propriétés. Une séquence est un objet lié par schéma défini par l'utilisateur qui génère une séquence de valeurs numériques d'après 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) lorsque é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 séquence pour extraire 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 des colonnes d’identité générées lorsque des lignes sont insérées, une application peut obtenir le numéro de séquence suivant sans insérer la ligne en appelant next VALUE FOR. Utilisez sp_sequence_get_range pour obtenir plusieurs numéros séquentiels à la fois.

Pour plus d’informations et de scénarios qui utilisent à la fois CREATE SEQUENCE et la NEXT VALUE FOR fonction, consultez Numéros de séquence.

Conventions de la syntaxe Transact-SQL

Syntaxe

CREATE SEQUENCE [ schema_name . ] sequence_name
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]
    [ START WITH <constant> ]
    [ INCREMENT BY <constant> ]
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
    [ CYCLE | { NO CYCLE } ]
    [ { CACHE [ <constant> ] } | { NO CACHE } ]
    [ ; ]

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.

[ built_in_integer_type | utilisateur-defined_integer_type ]

Une séquence peut être définie comme tout type entier. Les types suivants sont autorisés.

  • tinyint : plage comprise entre 0 et 255
  • smallint : plage comprise entre -32 768 et 32 767
  • int : plage comprise entre -2 147 483 648 et 2 147 483 647
  • bigint : plage comprise entre -9 223 372 036 854 775,808 et 9 223 372 036 854 775 807
  • décimal et numérique avec une échelle de 0.
  • Tout type de données défini par l'utilisateur (type d'alias) basé sur l'un des types autorisés.

Si aucun type de données n’est fourni, le type de données bigint est utilisé comme valeur par défaut.

CONSTANTE START WITH <>

Première valeur retournée par l'objet séquence. La START valeur doit être une valeur inférieure ou égale à la valeur maximale et supérieure ou égale à la valeur minimale de l’objet séquence. La valeur de début par défaut d'un nouvel objet séquence correspond à la valeur minimale pour un objet séquence croissant et à la valeur maximale pour un objet séquence décroissant.

INCRÉMENT BY <constante>

Valeur utilisée pour incrémenter (ou décrémenter si négative) la valeur de l’objet séquence pour chaque appel à la NEXT VALUE FOR fonction. Si l’incrément est une valeur négative, l’objet séquence est décroissant ; sinon, c’est croissant. L’incrément ne peut pas être 0. L'incrément par défaut pour un nouvel objet séquence est 1.

[ CONSTANTE< MINVALUE >| NO MINVALUE ]

Spécifie les limites de l'objet séquence. La valeur minimale par défaut d'un nouvel objet séquence correspond à la valeur minimale du type de données de l'objet séquence. 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.

[ CONSTANTE< MAXVALUE >| NO MAXVALUE

Spécifie les limites de l'objet séquence. La valeur maximale par défaut d'un nouvel objet séquence correspond à la valeur maximale du type de données de l'objet séquence.

[ CYCLE | PAS CYCLE ]

Propriété qui spécifie si l'objet séquence doit redémarrer de la valeur minimale (ou maximale pour les objets de séquence décroissante) ou générer 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.

Notes

SEQUENCE Le cyclisme redémarre à partir de la valeur minimale ou maximale, et non à partir de la valeur de départ.

[ CACHE [ <constante> ] | NO CACHE ]

Augmente la performance des applications qui utilisent des objets séquences en réduisant le nombre d'E/S sur le disque requises pour générer des numéros séquentiels. 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 mises en cache. Il met uniquement en cache la valeur actuelle et la quantité de valeurs restantes dans le cache. Cela signifie que la quantité de mémoire requise pour stocker le cache correspond toujours à deux instances du type de données de l'objet séquence.

Notes

Si l’option de cache est activée sans spécifier de taille de cache, le moteur de base de données sélectionne une taille. Toutefois, les utilisateurs ne doivent pas s’appuyer sur la sélection cohérente. Microsoft peut modifier la méthode de calcul de la taille du cache sans préavis.

Une fois créé avec l’option CACHE , un arrêt inattendu (tel qu’une panne d’alimentation) peut entraîner la perte de numéros de séquence restant dans le cache.

Remarques

Les numéros séquentiels sont générés à l'extérieur de l'étendue de la transaction actuelle. Elles sont consommées si la transaction utilisant le numéro de séquence est validée ou restaurée. La validation des doublons ne se produit qu’une fois qu’un enregistrement est entièrement rempli. Dans certains cas, il peut arriver que le même numéro soit utilisé pour plusieurs enregistrements durant la création, d’où son identification en tant que doublon. Si cela se produit et que d’autres valeurs de numérotation automatique ont été appliquées aux enregistrements suivants, il peut en résulter 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 nombres de séquences spécifiés par l’argument CACHE .

Par exemple, une nouvelle séquence est créée avec une valeur de départ de 1 et une taille du cache de 15. Lorsque la première valeur est exigée, les valeurs 1 à 15 sont rendues disponibles à partir de la mémoire. La dernière valeur mise en cache (15) est écrite dans les tables système sur le disque. Lorsque les 15 nombres sont utilisés, la demande suivante (pour le nombre 16) entraînera une nouvelle allocation du cache. La nouvelle valeur mise en cache (30) est écrite dans les tables système.

Si le Database Engine est arrêté après que vous avez utilisé 22 numéros, le numéro séquentiel prévu suivant en mémoire (23) est écrit dans les tables système, remplaçant ainsi le nombre précédemment stocké.

Après le redémarrage de SQL Server, un numéro séquentiel est exigé ; le nombre initial est lu à partir des tables système (23). Le montant de cache de 15 nombres (23-38) est alloué à la mémoire et le numéro de non-cache suivant (39) est écrit dans les tables système.

Si le Database Engine s’arrête de manière anormale suite à un événement tel qu’une panne de courant, la séquence redémarre avec le numéro lu à partir des tables système (39). Tous les numéros séquentiels 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 objet séquence unique, sauf si elle est définie comme CYCLE ou est redémarrée manuellement.

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

Définition de l’argument de cache pour NO CACHE écrire la valeur de 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 les risques d'espaces vides non désirés. Les lacunes peuvent toujours se produire si des nombres sont demandés à l’aide des NEXT VALUE FOR fonctions, 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 séquence utilise l’optionCACHE, si vous redémarrez l’objet séquence ou modifiez les INCREMENTpropriétés , , CYCLEMINVALUEMAXVALUEou les propriétés de taille du cache, le cache est écrit dans les tables système avant la modification. Ensuite, le cache est rechargé à partir de la valeur actuelle (autrement dit, aucun nombre n’est ignoré). Toute modification apportée à la taille du cache prend effet immédiatement.

Option CACHE lorsque les valeurs mises en cache sont disponibles

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

  1. La valeur suivante de l'objet séquence est calculée.
  2. La nouvelle valeur actuelle de l'objet séquence est mise à jour en mémoire.
  3. La valeur calculée est retournée à l'instruction appelante.

Option CACHE lorsque le cache est épuisé

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

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

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

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

Option NO CACHE

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

  1. La valeur suivante de l'objet séquence est calculée.
  2. La nouvelle valeur actuelle de l'objet séquence est écrite dans la table système.
  3. La valeur calculée est retournée à l'instruction appelante.

Métadonnées

Pour plus d’informations sur les séquences, interrogez sys.sequences.

Sécurité

Autorisations

Nécessite CREATE SEQUENCE, ALTERou CONTROL autorisation sur le SCHEMA.

  • 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 db_owner et db_datawriter rôles de base de données fixes peuvent mettre à jour des objets séquences en les provoquant à générer des nombres.

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

GRANT CREATE SEQUENCE
    ON SCHEMA::Test TO [AdventureWorks\Larry];

La propriété d’un objet 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 REFERENCES l’autorisation sur le type.

Audit

Pour auditer CREATE SEQUENCE, surveillez le SCHEMA_OBJECT_CHANGE_GROUP.

Exemples

Pour obtenir des exemples de création de séquences et d’utilisation de la NEXT VALUE FOR fonction pour générer des numéros de séquence, consultez Numéros de séquence.

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

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

CREATE SCHEMA Test;
GO

R. Créer une séquence qui augmente de 1

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

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

B. Créer une séquence qui diminue de 1

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

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

C. Créer 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éer une séquence qui commence par un nombre désigné

Après avoir importé une table, Thierry remarque que le numéro d'ID le plus élevé utilisé est 24 328. Thierry a besoin d’une séquence qui génère des nombres commençant à 24 329. Le code suivant crée une séquence qui démarre à 24 329 et est incrémentée de 1.

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

E. Créer une séquence à l’aide de 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 consulter 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 Valeur par défaut
start_value -9223372036854775808
increment 1
minimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. Créer une séquence avec un type de données spécifique

L’exemple suivant crée une séquence à l’aide du type de données smallint, avec une plage comprise entre -32 768 et 32 767.

CREATE SEQUENCE SmallSeq
    AS SMALLINT;

G. Créer une séquence à l’aide de tous les arguments

L’exemple suivant crée une séquence nommée DecSeq à l’aide du type de données decimal, avec une plage comprise entre 0 et 255. La séquence démarre à 125 et est incrémentée de 25 chaque fois qu'un nombre est généré. Étant donné que la séquence est configurée pour se répéter 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 consulter la première valeur ; l'option START WITH de 125.

SELECT  NEXT VALUE FOR Test.DecSeq;

Exécutez l'instruction trois autres fois pour retourner 150, 175 et 200.

Exécutez une nouvelle fois l'instruction pour voir comment la valeur de début revient en arrière à l'option MINVALUE de 100.

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

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