sql >> Database >  >> RDS >> Oracle

Een triggers maken

Wat je hier hebt, is een tabelbeperking voor meerdere rijen - d.w.z. je kunt niet zomaar een enkele Oracle CONSTRAINT plaatsen op een kolom, omdat deze alleen gegevens in één rij tegelijk kunnen bekijken.

Oracle biedt ondersteuning voor slechts twee typen beperkingen tussen rijen:uniciteit (bijv. primaire sleutels en unieke beperkingen) en referentiële integriteit (buitenlandse sleutels).

In uw geval moet u de beperking zelf met de hand coderen - en daarmee komt de verantwoordelijkheid om ervoor te zorgen dat de beperking niet wordt geschonden in de aanwezigheid van meerdere sessies, die elk geen gegevens kunnen zien die zijn ingevoegd/geüpdatet door andere gelijktijdige sessies (tenminste, totdat ze zich committeren).

Een simplistische benadering is om een ​​trigger toe te voegen die een query uitgeeft om te tellen hoeveel records conflicteren met het nieuwe record; maar dit zal niet werken omdat de trigger geen rijen kan zien die zijn ingevoegd/geüpdatet door andere sessies maar nog niet vastgelegd zijn; dus de trigger stelt leden soms in staat om 6 video's te huren, zolang ze (bijvoorbeeld) twee kassiers krijgen om de gegevens in afzonderlijke terminals in te voeren.

Enkele reis om dit probleem te omzeilen, is door een element van serialisatie in te voeren - b.v. de trigger zou eerst een blokkering van het lidmaatschapsrecord vragen (bijvoorbeeld met een SELECT FOR UPDATE) voordat het de verhuur mag controleren; op die manier, als een 2e sessie probeert verhuur in te voegen, zal het wachten tot de eerste sessie een commit of rollback doet.

Op een andere manier om dit probleem te omzeilen, is het gebruik van een geaggregeerde gematerialiseerde weergave, die zou zijn gebaseerd op een query die is ontworpen om rijen te vinden die de test niet doorstaan; de verwachting is dat de MV leeg zal zijn, en je plaatst een tabelbeperking op de MV zodat als er ooit een rij in de MV zou verschijnen, de beperking zou worden geschonden. Het effect hiervan is dat elke instructie die rijen probeert in te voegen die de beperking schenden, een schending van de beperking veroorzaakt wanneer de MV wordt vernieuwd.

Het schrijven van de vraag hiervoor op basis van uw ontwerp wordt overgelaten als een oefening voor de lezer :)



  1. Een logo toevoegen aan een formulierkoptekst in Microsoft Access

  2. MySQL - Tabelrijen bijwerken zonder de rijen te vergrendelen

  3. Hoe het verschil tussen opeenvolgende rijen in MySQL te krijgen?

  4. Overzicht creëren over verschillende databases