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 = 759673754Nous 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);
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