SQL Server 2012 a introduit les objets SEQUENCE.
Ils permettent, en outre, de spécifier des contraintes de valeur par défaut. Ils vont aussi remplacer la propriété d’auto-incrémentation typiquement utilisée pour les colonnes supportant des contraintes de clé primaire subrogée.
Dès lors, comment retrouver les séquences référencées par de telles contraintes ? Voici un exemple et une petite requête pour nous y aider …
Pour l’exemple, supposons la séquence et la table suivantes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | USE ELSUKET GO CREATE SEQUENCE dbo.seq_user AS int START WITH -2147483648 INCREMENT BY 1 ; GO CREATE TABLE t_user ( id int NOT NULL CONSTRAINT PK_t_user PRIMARY KEY CONSTRAINT DF_t_user__id DEFAULT (NEXT VALUE FOR dbo.seq_user) , name varchar(32) NOT NULL CONSTRAINT UQ_t_user__name UNIQUE ) |
Il est nécessaire d’utiliser la fonction de gestion dynamique sys.dm_sql_referencing_entities() pour retrouver les caractéristiques de la contrainte :
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT QUOTENAME(SCHEMA_NAME(T.schema_id)) + '.' + QUOTENAME(T.name) AS table_name , QUOTENAME(DC.name) AS default_constraint_name , QUOTENAME(SCHEMA_NAME(SQ.schema_id)) + '.' + QUOTENAME(SQ.name) AS sequence_name , 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(T.schema_id)) + '.' + QUOTENAME(T.name) + ' DROP CONSTRAINT ' + QUOTENAME(DC.name) AS sql_drop_constraint FROM sys.sequences AS SQ CROSS APPLY sys.dm_sql_referencing_entities(QUOTENAME(SCHEMA_NAME(SQ.schema_id)) + '.' + QUOTENAME(SQ.name), 'OBJECT') AS RE INNER JOIN sys.default_constraints AS DC ON RE.referencing_id = DC.object_id INNER JOIN sys.tables AS T ON T.object_id = DC.parent_object_id WHERE T.name = 't_user' |
ce qui donne :
ElSüket.