La validation de la mise à JOUR et INSERT à l'encontre de l'ensemble de la table

Je suis à la recherche de la meilleure façon d'aller sur l'ajout d'une contrainte à une table qui est effectivement un index unique sur la relation entre l'enregistrement et le reste des enregistrements dans cette table.

Imaginez le tableau suivant décrivant les patrouilles de divers gardes (à partir de la précédente veilleur de scénario)

PK  PatrolID Integer
FK  GuardID  Integer
    Starts   DateTime
    Ends     DateTime

Nous commençons avec une contrainte spécifiant que le début et la fin des temps doit être logique:

Ends >= Starts

Cependant je veux ajouter une autre logique de contrainte: Une garde (GuardID) ne peut pas être à deux endroits en même temps, ce qui signifie que pour n'importe quel enregistrement de la période fixée par Démarrer/fin devrait se chevauchent pas avec la période définie pour tout autre patrouille par le gardien.

Je pense à deux façons d'essayer d'approcher ce:

Créer un déclencheur INSTEAD OF INSERT. Ce déclencheur serait alors utiliser des curseurs pour passer à travers la table INSERTED, en vérifiant à chaque enregistrement. Si un enregistrement en conflit avec un enregistrement existant, une erreur serait soulevée. Les deux problèmes que j'ai avec cette approche sont: je n'aime pas utiliser les curseurs dans une version moderne de SQL Server, et je ne suis pas sûr de la façon d'aller sur implimenting la même logique pour les Mises à jour. Il peut aussi y avoir de la complexité des dossiers à l'intérieur INSÉRÉ conflit les uns avec les autres.

Le second, apparemment mieux, approche serait de créer une CONTRAINTE qui appelle une fonction définie par l'utilisateur, en passant la PatrolID, GuardID, Commence et se Termine. La fonction serait alors de faire une OÙ il EXISTE requête de vérification de tous les dossiers qui se chevauchent les GuardID/Commence/Termine les paramètres qui ne sont pas l'original PatrolID enregistrement. Cependant, je ne suis pas sûr de ce que les effets secondaires potentiels de cette approche pourrait avoir.

Est la deuxième meilleure approche? Personne ne voir aucun des écueils, tels que lors de l'insertion/mise à jour de plusieurs lignes à la fois (ici, je suis préoccupé parce que les lignes à l'intérieur de ce groupe pourrait entrer en conflit, sens de l'ordre, ils sont "insérés" fait une différence). Est-il une meilleure manière de faire ceci (comme certains de fantaisie INDICE de truc?)

OriginalL'auteur David | 2009-06-18