Avatar billede Lasse Novice
18. juni 2001 - 23:04 Der 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?
Avatar billede 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;
/
Avatar billede jacobve Nybegynder
18. juni 2001 - 23:17 #2
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;
/

Avatar billede Slettet bruger
18. juni 2001 - 23:21 #3
Ups, jeg glemte end END IF. Håber du selv kan finde ud af, hvor :-)
Avatar billede jacobve Nybegynder
18. juni 2001 - 23:22 #4
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...
Avatar billede jacobve Nybegynder
18. juni 2001 - 23:24 #5
joern_h >> skal -20001 skrives som \'-20001\' ??
Avatar billede Slettet bruger
18. juni 2001 - 23:28 #6
jacobve --> Du har ret, man behøver ikke at plinge -20001
Avatar billede jacobve Nybegynder
18. juni 2001 - 23:29 #7
joern_h >>  men kan man??
Avatar billede Slettet bruger
18. juni 2001 - 23:30 #8
jacobve --> Ja, strengen bliver parset.
Avatar billede Lasse Novice
19. juni 2001 - 00:06 #9
jacobve.. jeg får en fejl:

invalid new or old specifikation

så prøvede jeg at indsætte :old.anden_kolonnenavn istedet for anden_kolonnenavn, men så får jeg følg:

invalid relational operator
Avatar billede Lasse Novice
19. juni 2001 - 00:08 #10
ahhh.
:old = old, så virker det...

jeg tester lige
Avatar billede Lasse Novice
19. juni 2001 - 00:50 #11
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?
Avatar billede 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\'.

Og denne trigger skulle så genindsætte data.

Jeg ved ikke, om det kunne mutere?

Avatar billede Lasse Novice
19. juni 2001 - 01:01 #13
ehhh....
Avatar billede Slettet bruger
19. juni 2001 - 01:05 #14
Hvad mener du med \'ehh..\'.

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;




Avatar billede Lasse Novice
19. juni 2001 - 01:49 #15
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
Avatar billede 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.
Avatar billede Lasse Novice
20. juni 2001 - 01:39 #17
ja, joern_h, det ser udtil at virke..... den tager jeg... men jeg har taget noget kode fra jacobve, så i må deles lidt om gevinsten.

tak begge to
Avatar billede jacobve Nybegynder
20. juni 2001 - 12:15 #18
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester