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

Oprettelse af en triggere

Det, du har her, er en begrænsning i en tabel på tværs - dvs. du kan ikke bare sætte en enkelt Oracle CONSTRAINT på en kolonne, da disse kun kan se på data inden for en enkelt række ad gangen.

Oracle understøtter kun to begrænsningstyper på tværs af rækker - unikhed (f.eks. primære nøgler og unikke begrænsninger) og referentiel integritet (fremmednøgler).

I dit tilfælde bliver du selv nødt til at håndkode begrænsningen - og med det følger ansvaret for at sikre, at begrænsningen ikke overtrædes ved tilstedeværelse af flere sessioner, som hver især ikke kan se data indsat/opdateret af andre samtidige sessioner (i hvert fald indtil de forpligter sig).

En forenklet tilgang er at tilføje en trigger, der udsender en forespørgsel for at tælle, hvor mange poster der er i konflikt med den nye post; men dette vil ikke fungere, fordi udløseren ikke kan se rækker, der er blevet indsat/opdateret af andre sessioner, men som ikke er committet endnu; så udløseren vil nogle gange tillade medlemmer at leje 6 videoer, så længe de (for eksempel) får to kasserere til at indtaste dataene i separate terminaler.

En vej at komme uden om dette problem er at lægge et eller andet element af serialisering i - f.eks. udløseren vil først anmode om en låsning af medlemsregistreringen (f.eks. med en VÆLG TIL OPDATERING), før det er tilladt at kontrollere lejemålene; på den måde, hvis en 2. session forsøger at indsætte lejemål, vil den vente, indtil den første session foretager en commit eller rollback.

En anden måde omkring dette problem er at bruge en aggregerende materialiseret visning, som ville være baseret på en forespørgsel, der er designet til at finde alle rækker, der fejler testen; forventningen er, at MV'en vil være tom, og du sætter en tabelbegrænsning på MV'en, således at hvis en række nogensinde skulle vises i MV'en, ville begrænsningen blive overtrådt. Effekten af ​​dette er, at enhver erklæring, der forsøger at indsætte rækker, der overtræder begrænsningen, vil forårsage en begrænsningsovertrædelse, når MV'en opdateres.

At skrive forespørgslen til dette baseret på dit design efterlades som en øvelse for læseren :)



  1. Sådan transponeres MYSQL db i PHP

  2. Sådan opretter du en tabel i SQL Server ved hjælp af en forespørgsel

  3. Support server side forberedt erklæringer med PDO?

  4. Sådan omdirigeres stdout fra docker-container til vært