Avatar billede arnebjarne Nybegynder
16. december 2002 - 17:03 Der er 6 kommentarer og
2 løsninger

Problem med afvikling af trigger

Jeg har på en tabel lavet en update trigger, der opdaterer nogle data i andre tabeller.

Når jeg ændrer et bestemt felt på en vilkårlig post manuelt (via enterprise manager) virker triggeren fint.

Når jeg ændrer samme felt på alle poster i tabellen via en stump SQL kode, virker triggeren tilsyneladende ikke. Jeg har selvfølgelig kontrolleret at det felt jeg opdaterer via SQL koden rent faktisk bliver ændret.

Er der nogen, der har et tip?
Avatar billede jenslh Nybegynder
16. december 2002 - 18:18 #1
På en oracle database kan en trigger relateres til enten at fyre på rækkebasis eller på statement basis. Jeg vil gætte på, at en MS SQL har lignende ting, samt at din trigger er sat til at fyre på "statement niveau" - men nu har du jo heller ikke bragt koden til triggeren, så det er og bliver et gæt.
Avatar billede cbp Nybegynder
16. december 2002 - 18:34 #2
Det kunne lyde som om din trigger kun opdaterer en enkelt row og da en trigger kun bliver kaldt en gang uanset antallet af rows som bliver ændret bliver kun den sidste row ændret.
Avatar billede janus_007 Nybegynder
16. december 2002 - 19:36 #3
Simpelt nok :O)

CREATE TRIGGER [your_triggername] ON [table1]
FOR UPDATE
AS
IF @@rowcount = 0 RETURN
DECLARE @id AS INT
SELECT @id = id FROM DELETED
UPDATE table2 SET f1 = value1, f2=value2
WHERE id = @id

Hvor id er unique !
Avatar billede kichian Nybegynder
19. december 2002 - 10:23 #4
Problemet med janus_007 kode er, at den virker som arnebjarne har lavet sin kode. Dvs at selvom flere rækker UPDATES i table1 i et hug, som kører koden kun for en af rækkerne.
Koden burde i stedet være:

UPDATE table2 SET f1 = value1, f2=value2
WHERE id in (select id from DELETED)
Avatar billede kichian Nybegynder
19. december 2002 - 10:25 #5
Og i relation til Oracle, så har MS SQL kun en statement-trigger, ikke en rowlevel-trigger.
Avatar billede janus_007 Nybegynder
19. december 2002 - 10:53 #6
kichian ->> det er heller ikke korrekt (den gør det samme som min)!! - Der mangler et join til inserted row!! (til dem der ikke lige ved det, består en update egentlig af en delete og en insert), således her:

CREATE  TRIGGER [your_triggername] ON [table1]
FOR update
AS
IF @@rowcount = 0 RETURN

IF UPDATE(field1) --< det pågældende felt der udløser triggeren
UPDATE tabl1 SET field2 = value1 --< og feltet der ønskes updatet, med værdi
FROM INSERTED
JOIN
table1 ON table1.id = INSERTED.id

Nu funker det... :O)
Avatar billede kichian Nybegynder
19. december 2002 - 11:17 #7
janus 007 ->> Ja, nu funker det.
Avatar billede arnebjarne Nybegynder
15. januar 2003 - 10:48 #8
Jeg beklager at jeg ikke har givet jer pointene før. Jeres svar virker helt fint, og i min befippelse over at have fået det til at virke glemte jeg helt at svare. Jeg har valgt at dele pointene mellem jer.
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