Je cherche le meilleur moyen d'ajouter une contrainte à une table qui est effectivement un index unique sur la relation entre l'enregistrement et le reste des enregistrements dans cette table.Validation des instructions UPDATE et INSERT sur une table entière
Imaginez le tableau suivant décrit les patrouilles de divers gardes (du précédent scénario de gardien)
PK PatrolID Integer
FK GuardID Integer
Starts DateTime
Ends DateTime
Nous commençons par une contrainte précisant que les temps de début et de fin doivent être logiques:
Ends >= Starts
Cependant, je souhaite ajouter une autre contrainte logique: Un garde spécifique (GuardID) ne peut pas être à deux endroits en même temps, ce qui signifie que pour tout enregistrement, la période spécifiée par Début/Fin ne doit pas chevaucher la période définie pour toute autre patrouille. le même garde .
je peux penser à deux façons d'essayer d'aborder ceci:
Créer un déclencheur INSTEAD OF INSERT. Ce déclencheur utiliserait alors des curseurs pour parcourir la table INSERTED, en vérifiant chaque enregistrement. Si un enregistrement est en conflit avec un enregistrement existant, une erreur est généré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 savoir comment implémenter la même logique pour les UPDATE. Il peut également exister une complexité des enregistrements INSERTED en conflit les uns avec les autres.
La deuxième approche, apparemment meilleure, consisterait à créer une CONTRAINTE qui appelle une fonction définie par l'utilisateur, en transmettant les identifiants PatrolID, GuardID, Starts et Ends. La fonction effectue ensuite une recherche WHERE EXISTS pour rechercher les enregistrements qui chevauchent les paramètres GuardID/Starts/Ends qui ne sont pas l'enregistrement PatrolID d'origine. Cependant, je ne suis pas sûr des effets secondaires potentiels de cette approche.
La deuxième approche est-elle meilleure? Quelqu'un voit-il des pièges, comme lors de l'insertion/mise à jour de plusieurs lignes à la fois (ici, je suis concerné parce que les lignes dans ce groupe pourraient entrer en conflit, ce qui signifie que l'ordre est "inséré"). Y a-t-il une meilleure façon de le faire (comme un truc de fantaisie d'INDEX?)
Triggers sont nécessaires pour ce genre de chose que les enregistrements peuvent être insérés des endroits autres que le proc. Si vous n'appliquez pas le niveau de déclenchement, vous ne pouvez pas garantir l'intégrité des données. – HLGEM
Eh bien, c'est pourquoi personne n'obtient des droits INSERT. – Andomar