sql >> Databasteknik >  >> RDS >> Oracle

Skapa en utlösare

Det du har här är en tabellrestriktion för flera rader - det vill säga du kan inte bara sätta en enda Oracle CONSTRAINT på en kolumn, eftersom dessa bara kan titta på data inom en enda rad åt gången.

Oracle har endast stöd för två begränsningstyper i korsrader - unikhet (t.ex. primärnycklar och unika begränsningar) och referensintegritet (främmande nycklar).

I ditt fall måste du handkoda begränsningen själv - och med det följer ansvaret att se till att begränsningen inte överträds i närvaro av flera sessioner, som var och en inte kan se data infod/uppdaterad av andra samtidiga sessioner (åtminstone tills de begår).

Ett förenklat tillvägagångssätt är att lägga till en utlösare som skickar en fråga för att räkna hur många poster som är i konflikt med den nya posten; men det här kommer inte att fungera eftersom utlösaren inte kan se rader som har infogats/uppdaterats av andra sessioner men som ännu inte har aktiverats; så utlösaren tillåter ibland medlemmar att hyra 6 videor, så länge de (till exempel) får två kassörer att ange data i separata terminaler.

En väg för att komma runt detta problem är att lägga in något element av serialisering i - t.ex. utlösaren skulle först begära ett lås på medlemsregistret (t.ex. med en VÄLJ FÖR UPPDATERING) innan det är tillåtet att kontrollera hyrorna; på det sättet, om en andra session försöker infoga hyrda, väntar den tills den första sessionen gör en commit eller återställning.

Ett annat sätt kring detta problem är att använda en aggregerande materialiserad vy, som skulle baseras på en fråga som är utformad för att hitta alla rader som inte klarar testet; förväntningen är att MV kommer att vara tom, och du sätter en tabellbegränsning på MV så att om en rad någonsin skulle visas i MV, skulle begränsningen överträdas. Effekten av detta är att varje sats som försöker infoga rader som bryter mot begränsningen kommer att orsaka en begränsningsöverträdelse när MV uppdateras.

Att skriva frågan för detta baserat på din design lämnas som en övning för läsaren :)



  1. SQL Server:Exempel på PIVOTing String-data

  2. Kombinera flera SELECT-satser

  3. SQL Server 2000:Idéer för att utföra sammanlänkningsunderfrågan

  4. Oväntad databasutdata när INNER JOIN används