Ich bin auf der Suche nach dem besten Weg zum Hinzufügen einer Einschränkung für eine Tabelle, die effektiv ein eindeutiger Index für die Beziehung zwischen dem Datensatz und den Rest der Datensätze in dieser Tisch.Überprüfung UPDATE und INSERT-Anweisungen für eine ganze Tabelle
Stellen Sie sich die folgende Tabelle zeigt die Patrouillen der verschiedenen Wachen (aus dem früheren Wächter-Szenario) beschreiben
PK PatrolID Integer
FK GuardID Integer
Starts DateTime
Ends DateTime
Wir waren mit einer Einschränkung beginnen die Angabe, dass die Start- und Endzeiten logisch sein muss:
Ends >= Starts
Ich möchte jedoch eine weitere logische Einschränkung hinzufügen: Eine bestimmte Wache (GuardID) darf nicht gleichzeitig an zwei Orten sein, was bedeutet, dass für jeden Datensatz der durch Start/Ende festgelegte Zeitraum nicht mit dem für jede andere Patrouille definierten Zeitraum überlappen sollte die gleiche Wache .
Ich denke an zwei Möglichkeiten, kann versuchen, diesen Ansatz:
einen STATT INSERT-Trigger erstellen. Dieser Trigger würde dann Cursor verwenden, um durch die INSERTED-Tabelle zu gehen und jeden Datensatz zu prüfen. Wenn ein Datensatz mit einem vorhandenen Datensatz in Konflikt steht, wird ein Fehler ausgelöst. Die zwei Probleme, die ich mit diesem Ansatz habe, sind: Ich mag nicht Cursor in einer modernen Version von SQL Server verwenden, und ich bin mir nicht sicher, wie man die gleiche Logik für UPDATEs zu implementieren. Es kann auch die Komplexität von Datensätzen innerhalb von INSERTED geben, die miteinander in Konflikt stehen.
Der zweite, scheinbar bessere Ansatz wäre, einen CONSTRAINT zu erstellen, der eine benutzerdefinierte Funktion aufruft, die die PatrolID, GuardID, Starts und Ends übergibt. Die Funktion würde dann eine WHERE EXISTS-Abfrage durchführen, die nach Datensätzen sucht, die sich mit den GuardID/Start/Ends-Parametern überschneiden, die nicht dem ursprünglichen PatrolID-Datensatz entsprechen. Ich bin mir jedoch nicht sicher, welche möglichen Nebenwirkungen dieser Ansatz haben könnte.
Ist der zweite Ansatz besser? Sieht jemand irgendwelche Fallstricke, wie zum Beispiel beim Einfügen/Aktualisieren mehrerer Zeilen gleichzeitig (hier bin ich besorgt, weil Zeilen innerhalb dieser Gruppe einen Konflikt verursachen könnten, was bedeutet, dass die Reihenfolge, in der sie "eingefügt" werden, einen Unterschied macht). Gibt es eine bessere Möglichkeit, dies zu tun (z. B. einen ausgefallenen INDEX-Trick?)
Trigger sind für diese Art der Sache notwendig, da Aufzeichnungen von anderen Orten als der proc eingesetzt werden können. Wenn Sie die Trigger-Ebene nicht erzwingen, können Sie die Datenintegrität nicht garantieren. – HLGEM
Nun, deshalb bekommt niemand INSERT-Rechte. – Andomar