Gå til innhold

Hvordan stoppe en spørring (sletting) i oracle?


Anbefalte innlegg

Skrevet (endret)

Jeg lurer på en ting: si at jeg har en tabell der jeg vil at enkelte rader ikke skal kunne slettes, basert på et eller annet kriterie, f.eks om de har 1 eller 0 i en kolonne som heter readonly.

 

Hvis jeg da lager en trigger som ser sånn ut:

CREATE OR REPLACE TRIGGER ikke_slett 
BEFORE DELETE ON tabell
BEGIN
IF ( readonly = 1) THEN
ikke slett; 
END;

 

Da blir spørsmålet: hva skal inn der jeg har skrevet "ikke slett"? Eller vil ikke dette kunne fungere i det hele tatt?

 

Petter

Endret av G2Petter
Videoannonse
Annonse
Skrevet
Jeg lurer på en ting: si at jeg har en tabell der jeg vil at enkelte rader ikke skal kunne slettes, basert på et eller annet kriterie, f.eks om de har 1 eller 0 i en kolonne som heter readonly.

 

Hvis jeg da lager en trigger som ser sånn ut:

CREATE OR REPLACE TRIGGER ikke_slett 
BEFORE DELETE ON tabell
BEGIN
IF ( readonly = 1) THEN
ikke slett; 
END;

 

Da blir spørsmålet: hva skal inn der jeg har skrevet "ikke slett"? Eller vil ikke dette kunne fungere i det hele tatt?

 

Petter

 

Du må bare få en exception til å skje, altså få det hele til å rett og slett kræsje. Oracle kjører automatisk en rollback dersom ting havarerer i et program, og utfører ikke da transaksjonen som ble startet.

Skrevet
Det vil vel være absolutt den mest grisete måten å løse det på...

Nja, det vil jeg nå ikke se. Jeg har i årenes løp sett flere eksempler på at tilsvarende er anbefalt, på en eller annen måte. Et annet eksempel er å ha en trigger som i steden for å slette raden setter "deleted" til 1, for å beholde full historikk.

Skrevet

Det som vil være typisk er at applikasjonen skal sjekke om den har lov til å slette raden, hvis ikke så sier den ifra til brukeren på en normal måte (ikke gjennom exception handling - det er jo noe som ofte kan skje)

 

Hvis noen prøver å slette raden og den er satt til "ikke slett" så får du en exception - f.eks hvis du har to steder i programmet ditt du prøver å slette, og du bare har håndtert det riktig på det ene stedet.

Skrevet

Det som ER typisk, er at du har valget om å løse ting på klientsiden eller applikasjonssiden. Hvis du velger å gjøre alt på applikasjonssiden så har du rett, dersom du velger å løse ting på klientsiden i steden så vil en trigger være løsningen. Det er flere forhold som bør legges til grunn for et valg her, som f eks infrastruktur, aktivitetsnivå, forskjellige versjoner av klienter, krevet responstid og så videre.

 

Det er ingen ting som sier at det er GALT å løse ting i databaseserveren. Det har helt klart sine fordeler, men som i likhet med applikasjonssiden også sine svakheter.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...