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?
I samarbejde med droneproducenter og finske Sulava sætter Delegate sine teknologiske muskler og innovation i spil i forsvarsområdet.
13. juni 2025
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.