Sunday 4 December 2011

SQL Server - une bonne pratique pour la déclaration de CONSTRAINT - French Version

Un objet d'une base de données SQL Server peut être relié à plusieurs contraintes (clé primaire, clé étrangère, contrôle de valeurs, ...). Ces contraintes peuvent être définis soit à la création de l'objet lui-même soit plus tard par une modification depuis la commande ALTER.

J'ai vu souvent vu des scripts de création de contraintes de ce type :


CREATE TABLE [TIPS_05] (ID INT, AGE INT CHECK( AGE > 0))

Malgré le fait que le script passe en exécution, il importe de noter que SQL Server va créer implicitement une contrainte pour 'CHECK(AGE > 0)'


Problématique :

- Supposons que l'entreprise ait une norme établie pour le nommage des objects SQL créés ( y compris les contraintes).
- A un certain moment, une contrainte peut faire l'objet d'une désactivation temporaire, par exemple pour une modification exceptionnelle d'une valeur de la colonne AGE - pour le cas de personne dont l'age n'est pas connue.


La pratique ci-dessus ne vas pas à l'encontre de ce principe. En effet, par principe, la recommandation est de désactivée temporairement la contrainte avant l'insertion et de le remettre une fois les mises à jour effectuées.
Dans le cas présent, nous ne pouvons pas 'deviner à priori' le nom de la contrainte car c'est SQL qui l'a attribué automatiquement

Néanmoins, nous pouvons la voir en executant la requête suivante : 


select * from sys.tables where name = 'TIPS_05'




puis par 
SELECT * FROM sys.objects where type = 'C' and parent_object_id = 759673754



Nous pouvons alors voir que le nom de la contrainte est 'CK__TIPS_05__AGE__2E3BD7D3'

Nous pouvons alors provisoirement la desactiver par 

ALTER TABLE [TIPS_05] NOCHECK CONSTRAINT CK__TIPS_05__AGE__2E3BD7D3

Puis insérer des valeurs non autorisées

INSERT INTO [TIPS_05] VALUES (3,-30)

Puis réactiver la contrainte

ALTER TABLE [TIPS_05] CHECK CONSTRAINT CK__TIPS_05__AGE__2E3BD7D3

Il était alors plus simple  et plus pratique de déclarer la contrainte comme ceci :

-à la rigueur :
CREATE TABLE [TIPS_05] (ID INT, AGE  INT CONSTRAINT CK_AGE  CHECK( AGE > 0))

- idéalement :
CREATE TABLE [TIPS_05] (ID INT, AGE INT);
GO
ALTER TABLE  [TIPS_05]  ADD CONSTRAINT CK_AGE CHECK (AGE > 0);
GO

Ici le nom de la contrainte a été défini explicitement, d'une manière plus facile à deviner selon les conventions de nommages établies.

No comments:

Post a Comment