2010-09-16 4 views
0

J'ai une suite de tests d'unité de base de données qui ont été créés. Afin de répliquer tous les tests sur toutes les machines sur lesquelles je déploie, il existe des scripts pour supprimer la base de données et la recréer. Le test fonctionnera pour tous les tests unitaires sauf pour le premier test.Vérification de l'identité d'une nouvelle table pour les tests d'unité de base de données

La raison pour laquelle le premier test échoue est que j'exécute la commande "dbcc checkident" avant chaque test et que je réinitialise toutes les identités afin de garantir que toutes les identités sont les mêmes. Sur une nouvelle table qui n'a jamais été insérée et où "dbcc checkident" a été exécuté, l'identité commence à 0 lorsqu'elle est insérée au lieu de 1.

Si j'utilise d'autres commandes intégrées pour vérifier l'identité dans une nouvelle table, ils renvoient 0 comme identité. L'avantage de vérifier via "dbcc checkident" est que l'identité revient à "NULL" si une ligne n'a jamais été insérée dans celle-ci. Seul "dbcc checkident" nous dit à travers un message d'impression et ne peut pas facilement être testé. Comment puis-je vérifier que j'ai besoin de réinitialiser l'identité ou pas via les commandes de base de données sans insérer une ligne, la supprimer, puis la réinitialiser juste pour éviter que l'identité ne sorte du premier enregistrement?

Exemple d'insertion dans une table

identité après l'insertion d'une rangée sur une table fraîche sans exécutant « dbcc CHECKIDENT » et réglage d'identité avec 0 = 1

identité après l'insertion d'une rangée sur nouvelle table et exécution "dbcc checkident" et définition de l'identité à 0 = 0

Identité après l'insertion d'une ligne sur une table existante "dbcc checkident" et définition de l'identité à 0 = 1

Répondre

1

Pour contourner le problème d'insertion d'identité avec "dbcc checkident" sur une nouvelle table, voici ce que j'ai fait. En utilisant les tables sys, j'ai pu vérifier manuellement la dernière valeur d'identité par sql. Si la dernière identité a été réinitialisée, elle changera la dernière valeur à 0. Sur une nouvelle table qui n'a jamais été insérée dans la dernière identité sera null.

Voici l'extrait de code que nous avons utilisé. Cela vous permettra de vérifier la dernière identité sans faire d'insertion, supprimer, réinitialiser l'identité.

-- {0} is your table name 
-- {1} is your identity value of the reset 

IF EXISTS (SELECT null FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = '{0}' AND   last_value IS NOT NULL) 
    DBCC CHECKIDENT ({0}, RESEED, {1}); 
Questions connexes