Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Trigger erstellen

Was Sie hier haben, ist eine zeilenübergreifende Tabelleneinschränkung – d. h. Sie können nicht einfach eine einzelne Oracle CONSTRAINT setzen in einer Spalte, da diese jeweils nur Daten innerhalb einer einzelnen Zeile betrachten können.

Oracle unterstützt nur zwei zeilenübergreifende Einschränkungstypen – Eindeutigkeit (z. B. Primärschlüssel und eindeutige Einschränkungen) und referenzielle Integrität (Fremdschlüssel).

In Ihrem Fall müssen Sie die Einschränkung selbst manuell codieren - und damit die Verantwortung, sicherzustellen, dass die Einschränkung nicht verletzt wird, wenn mehrere Sitzungen vorhanden sind, von denen jede keine Daten sehen kann, die von anderen gleichzeitigen Sitzungen eingefügt/aktualisiert wurden (zumindest bis sie sich verpflichten).

Ein einfacher Ansatz besteht darin, einen Auslöser hinzuzufügen, der eine Abfrage ausgibt, um zu zählen, wie viele Datensätze mit dem neuen Datensatz in Konflikt stehen; aber das wird nicht funktionieren, da der Trigger keine Zeilen sehen kann, die von anderen Sitzungen eingefügt/aktualisiert, aber noch nicht festgeschrieben wurden; Daher erlaubt der Auslöser manchmal Mitgliedern, 6 Videos zu mieten, solange sie (zum Beispiel) zwei Kassierer dazu bringen, die Daten in separate Terminals einzugeben.

Eine Richtung Um dieses Problem zu umgehen, fügen Sie ein Element der Serialisierung ein - z. Der Auslöser würde zuerst eine Sperre des Mitgliedsdatensatzes anfordern (z. B. mit einem SELECT FOR UPDATE), bevor er die Vermietungen überprüfen darf; Auf diese Weise wird, wenn eine zweite Sitzung versucht, Mieten einzufügen, gewartet, bis die erste Sitzung einen Commit oder Rollback durchführt.

Ein anderer Weg Um dieses Problem zu umgehen, kann eine aggregierende materialisierte Ansicht verwendet werden, die auf einer Abfrage basiert, die darauf ausgelegt ist, alle Zeilen zu finden, die den Test nicht bestehen. Die Erwartung ist, dass der MV leer ist, und Sie legen eine Tabelleneinschränkung für den MV fest, sodass die Einschränkung verletzt würde, wenn jemals eine Zeile im MV erscheinen würde. Dies hat zur Folge, dass jede Anweisung, die versucht, Zeilen einzufügen, die gegen die Einschränkung verstoßen, eine Einschränkungsverletzung verursacht, wenn der MV aktualisiert wird.

Das Schreiben der Abfrage dafür auf der Grundlage Ihres Designs bleibt dem Leser als Übung überlassen :)