18. juni 2001 - 23:04Der er
16 kommentarer og 2 løsninger
tjek kolonneværdi inden indsættelse
Jeg har en kolonne(1) som er afhængig af en anden(2). Begge ligger i samme tabel. Jeg må ikke kunne slette en værdi i kolonne 1 medmindre kolonne 2\'s værdi er NULL. Jeg kunne tænke mig at det kunne laves med Triggers, men jeg kan ikke lige finde ud af det... Nogen forslag?
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Slettet bruger
18. juni 2001 - 23:16#1
Kan du bruge noget i stil med:
CREATE TRIGGER triggername BEFORE UPDATE ON tablename FOR EACH ROW Begin if :old.kolonne1 is not null and :new.kolonne1 is null then if :new.kolonne2 is not null then raise_application_error(\'-20001\', \'AV\'); end if; End; /
Jeg har lige lavet et eksempel på en trigger, men aner faktisk ikke om den virker... :-)
CREATE OR REPLACE TRIGGER ingen_delete ON din_tabel BEFORE DELETE FOR EACH ROW WHEN (anden_kolonnenavn IS NOT NULL) BEGIN raise_application_error(-20001,\'der kan ikke slettes fra tabellen\'); END; /
Synes godt om
Slettet bruger
18. juni 2001 - 23:21#3
Ups, jeg glemte end END IF. Håber du selv kan finde ud af, hvor :-)
ok.. jeg kan godt se det skulle nok være en update, da det ikke er hele rækken der slettes. Dertil skal der nok også en :new. foran anden_kolonnenavn...
ok, jeg er mest interesseret i jacobve\'s ide... men der mangler stadig noget.
laver jeg en raise_application_error, stopper jeg programmets eksekvering. Derfor bruger jeg den lidt mere smarte raise her.
raise error_lige_her;
exception when error_lige_her then dbms_output.put_line(\'FEJL\');
Alligevel bliver dataen sat ind... hvilket den ikke skal. Hvad kan man gøre ved det?
Synes godt om
Slettet bruger
19. juni 2001 - 01:00#12
Man kunne måske indsætte rækker, der opdateres forkert, i en tabel \' ved siden af\' man kunne så have en trigger der fyrede \'After update\' i stedet for \'for each row\'.
1. Lav tabel \'dummy\'. 2. Når man ikke må raise en error, kan man vel ihvertfald sætte rækken ind i tabel dummy. 3. Lav en trigger, der fyrer \'after update\':
CREATE TRIGGER triggername AFTER UPDATE ON APPLICATIONEVENT begin insert into tabel select * from dummy; delete from dummy; end;
jeg forstår bare ikke din fremgangs måde, men jeg er også grøn i oracle...
På den anden side, så tror jeg også at det andet vil virke, det er bare et spg om syntaksen
Synes godt om
Slettet bruger
19. juni 2001 - 08:37#16
Man kunne måske gøre sådan her i stedet:
CREATE TRIGGER triggername BEFORE UPDATE ON tablename FOR EACH ROW Begin if :old.kolonne1 is not null and :new.kolonne1 is null then if :new.kolonne2 is not null then :new.kolonne1 := :old.kolonne1; :new.kolonne2 := :old.kolonne2; end if; end if; End; /
Ideen er: Hvis data er \'forkerte\' så opdater rækken med gamle værdier.
Okj, jeg var ikke lige klar på nattens oracle diskussion kan jeg se :-)
Men det er da godt i er kommet frem til en løsning.
Hilsen
Jacob
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.