Retrouver les séquences attachées à des contraintes de valeur par défaut

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.

Laisser un commentaire