2017-08-16 4 views
-1

Je dois être sûr de l'intégrité des données dans la base de données MSSQL. Mon modèle de données contient deux champs importants qui sont des clés étrangères à d'autres tables. Par exemple TripId et ReservationId (les noms aléatoires ne vous dérangent pas).Contrainte de Tricky combinant 2 colonnes

J'ai besoin la possibilité d'insérer des données si: - IdRéservation et TripId ne sont pas nulles - IdRéservation est nulle et TripId est non nul -ReservationId est non nul et TripId est nulle

Il est difficile, parce que J'ai besoin de rejeter des insertions quand l'un d'Id a été utilisé dans une autre combinaison, par exemple: Mon db contient un enregistrement avec RES111 et TRIP666. Je dois être capable d'insérer un autre enregistrement avec les mêmes IDs pour la réservation et le voyage. Je ne dois pas insérer de données qui ne contiennent qu'un seul ReservationId ou TripId ou une autre combinaison (par exemple rejeter: RES111 et TRIP777 doivent être rejetés)

Idem quand un Id est fourni, par exemple ReservationId. Les inserts contenant ReservationId utilisés avec tout ID de tripId doivent être rejetés.

Je peux fournir un tel filtrage dans le code d'application, mais il doit être fait au niveau de la base de données

+1

S'il vous plaît nous fournir un code, "nous" codeurs sont mieux à lire le code, puis lire un anglais clair, fournissent également un code de ce que vous avez essayé jusqu'à présent – DarkMukke

+3

Je pense que vous aurez besoin d'un déclencheur pour cela. –

+0

Je suis d'accord avec @GordonLinoff, je ne pense pas que les contraintes peuvent gérer ce genre de complexité – NickyvV

Répondre

0

Vous pouvez écrire un insert conditionnel
Par exemple

insert into tblname (value, name) 
select 'foo', 'bar' 
where not exists (select 1 from table where null IN (ReservationId, TripId)); 

Bien sûr, vous devrez adapter cette à ce dont vous avez besoin exactement.

Le concept de base est, tant que la sous-requête renvoie un résultat, l'insertion se produira, de sorte que la sous-requête peut être une contrainte ou un contrôle vraiment compliqué.

-1

Vous pouvez le faire soit avec un déclencheur, soit avec une contrainte CHECK qui appelle un UDF qui encapsule la logique que vous voulez appliquer.