G2Petter Skrevet 5. november 2007 Skrevet 5. november 2007 (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 5. november 2007 av G2Petter
Wolverin Skrevet 5. november 2007 Skrevet 5. november 2007 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.
Manfred Skrevet 5. november 2007 Skrevet 5. november 2007 Det vil vel være absolutt den mest grisete måten å løse det på...
roac Skrevet 6. november 2007 Skrevet 6. november 2007 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.
blackbrrd Skrevet 6. november 2007 Skrevet 6. november 2007 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.
roac Skrevet 6. november 2007 Skrevet 6. november 2007 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.
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå