2010-06-04 12 views
1

J'ai besoin d'importer beaucoup de données dans une base de données de serveur sql. Certaines de ces données ont été importées il y a longtemps et beaucoup d'entre elles ne conservent pas l'intégrité référentielle, mais je veux que toutes les nouvelles données le soient. Je peux désactiver les vérifications de contraintes avant l'importation, mais comment les restaure-t-on uniquement pour les données qui seront ajoutées plus tard? Est-ce possible ou dois-je corriger les données historiques?Limiter les contraintes de serveur SQL vérifie uniquement les nouvelles données

Merci,

Répondre

4

déposer vos contraintes FK, ajoutez les données, ajoutez vos FKs de retour avec NOCHECK

+0

idée BAd à moins que l'importation ne fonctionne que dans le mode utilisateur unique. Vous laissez tomber les contraintes pour tout le monde et pas seulement pour votre processus. Vous pourriez vous retrouver avec des données encore plus mauvaises de cette façon. – HLGEM

+0

Entièrement d'accord, les relations sont là pour une raison et ils devraient (presque toujours) être maintenu. Cependant, il existe des situations rares où il est impossible et/ou ne vaut pas la peine de revenir en arrière et de faire fonctionner les relations. Les conversions de systèmes hérités me viennent à l'esprit. -EDIT, je voulais m'en tenir à votre message, pas à votre commentaire. –

+0

La conversion de l'héritage est exactement ce que c'est. Cependant, il y en a peut-être assez peu pour que nous puissions réparer les anciennes données. Si non, cela fera l'affaire. Merci. – Jeff

2

Comme alternative laid, je suppose que vous pourriez avoir deux tables - une pour les anciennes données mauvaises, et un pour les nouveaux. Mettez les contraintes DRI uniquement sur la nouvelle table. Puis enveloppez-les avec UNION dans une VUE, afin que l'autre code puisse les interroger ensemble comme une seule unité.

1

Vous pouvez ajouter une contrainte qui vérifie les données uniquement à partir de ce moment, mais si vous essayez de mettre à jour cette ligne (comme dans un importer ou même via l'interface utilisateur), il va frapper la contrainte et échouer sauf si vous corrigez les données. Je vous recommande fortement de corriger les données avant d'ajouter des contraintes. Ce sont de mauvaises données de toute façon et devraient être corrigées. Vous pourriez avoir besoin d'ajouter un enregistrement par défaut pour INCONNU dans la table parent si vous avez des enregistrements qui ont un ID enfant mais pas de parent. Remplacez ensuite la référence par l'ID d'enregistrement INCONNU.

2

utilisation NOCHECK

exemple

CREATE TABLE CheckTbl (col1 int, col2 int); 
GO 


insert CheckTbl values(1,1) 
insert CheckTbl values(2,1) 

ALTER TABLE CheckTbl WITH NOCHECK 
ADD CONSTRAINT chkRowCount CHECK (col1 > 1) ; 
GO 

-- will fail now 
insert CheckTbl values(1,1)