sql >> Database teknologi >  >> RDS >> Oracle

Brug af underforespørgsel i en Check-erklæring i Oracle

Der er tre grundlæggende måder at løse denne slags problemer på, da CHECK-begrænsninger ikke kan baseres på en forespørgsel.

Mulighed 1:Udløsere

Den mest forenklede tilgang ville være at sætte en trigger på TANK, der forespørger TANKS og kaster en undtagelse, hvis LEVEL overskrider CAPACITY. Problemet med denne form for forenklede tilgang er dog, at det er næsten umuligt at håndtere samtidighedsproblemer korrekt. Hvis session 1 reducerer KAPACITETEN, så øger session 2 LEVEL, og begge transaktioner commit, vil triggere ikke være i stand til at opdage overtrædelsen. Dette er muligvis ikke et problem, hvis en eller begge tabeller sjældent ændres, men generelt vil det være et problem.

Mulighed 2:Materialiserede visninger

Du kan løse samtidighedsproblemet ved at oprette en ON COMMIT materialiseret visning, der forbinder TANK- og TANKS-tabellen og derefter oprette en CHECK-begrænsning på den materialiserede visning, der bekræfter, at LEVEL <=CAPACITY. Du kan også undgå at gemme data to gange ved at lade den materialiserede visning kun indeholde data, der ville overtræde begrænsningen. Dette vil kræve materialiserede visningslogfiler på begge basistabellerne, hvilket vil tilføje en smule overhead til indsatser (dog mindre end at bruge triggere). At skubbe afkrydsningsfeltet til commit-tid vil løse samtidighedsproblemet, men det introducerer lidt af et undtagelseshåndteringsproblem, da COMMIT-handlingen nu kan mislykkes, fordi den materialiserede opdatering af visningen mislykkedes. Din applikation skal være i stand til at håndtere dette problem og gøre brugeren opmærksom på det.

Mulighed 3:Skift datamodellen

Hvis du har en værdi i tabel A, der afhænger af en grænse i tabel B, kan det indikere, at grænsen i B burde være en egenskab til tabel A (i stedet for eller ud over at være en egenskab for tabel B). Det afhænger selvfølgelig af detaljerne i din datamodel, men det er ofte værd at overveje.



  1. Sådan analyseres tilstanden af ​​databaseindekser

  2. En guide til brug af pgBouncer til PostgreSQL

  3. Hvordan importerer jeg moduler eller installerer udvidelser i Postgres?

  4. ODBC-forespørgsel på MS SQL Server returnerer kun de første 255 tegn i PHP PDO (FreeTDS)