17. marts 2006 - 11:39Der er
15 kommentarer og 1 løsning
Fejl i trigger
Jeg har denne trigger:
CREATE TRIGGER RetKontoSaet ON OrdLn FOR INSERT,UPDATE AS BEGIN DECLARE @ordrenr INTEGER, @kontosaet INTEGER, @transtype INTEGER, @ordretype INTEGER, @gruppe4 INTEGER, @kundenr INTEGER
SELECT @ordrenr=OrdNo FROM inserted SELECT @ordrenr=OrdNo, @gruppe4=Gr4, @transtype=TrTp, @ordretype=OrdTp, @kundenr=CustNo, @kontosaet=AcSet FROM Ord WHERE OrdNo=@ordrenr
IF (@transtype=1) AND (@ordretype=1) BEGIN IF (@gruppe4=2) AND (@kontosaet=1) BEGIN update Ord set AcSet = 101 WHERE Ord.OrdNo = @ordrenr update OrdLn set AcSet = 101 WHERE OrdLn.OrdNo = @ordrenr END IF (@gruppe4=2) AND (@kontosaet=2) BEGIN update Ord set AcSet = 102 WHERE Ord.OrdNo = @ordrenr update OrdLn set AcSet = 102 WHERE OrdLn.OrdNo = @ordrenr END IF (@gruppe4=2) AND (@kontosaet=3) BEGIN update Ord set AcSet = 103 WHERE Ord.OrdNo = @ordrenr update OrdLn set AcSet = 103 WHERE OrdLn.OrdNo = @ordrenr END IF (@gruppe4=2) AND (@kontosaet=4) BEGIN update Ord set AcSet = 104 WHERE Ord.OrdNo = @ordrenr update OrdLn set AcSet = 104 WHERE OrdLn.OrdNo = @ordrenr END IF (@gruppe4=4) BEGIN update Ord set AcSet = @kundenr WHERE Ord.OrdNo = @ordrenr update OrdLn set AcSet = @kundenr WHERE OrdLn.OrdNo = @ordrenr END END END
Mit problem er at når jeg har flere linier i OrdLn, så er det kun den første linie der bliver opdateret. Hvordan får jeg den til at opdatere alle linieri OrdLn?
Men husk nu at hver gang du updater, så fyres triggeren af igen, så mon det ikke er det der er galt?
Jg ved faktisk ikke hvad ser sker når en trigger går i ring, det skulle da helst give en fejl.
Håber arne_v eller erik_jacobsen ser dette, de ved det garanteret.
Synes godt om
Slettet bruger
18. marts 2006 - 06:42#3
Hvad du ser er en rekursiv trigger og de er some jeg husker det slået fra default i SQL Server. Derfor rammer du kun den første.
Check status med EXEC sp_dboption 'databasenavn', 'recursive triggers'
For at slå til EXEC sp_dboption 'databasenavn', 'recursive triggers', 'true' For at slå fra EXEC sp_dboption 'databasenavn', 'recursive triggers', 'false'
Du skal nok overveje en anden løsning, for eksempel at lave dine inserts og updates gennem en stored-procedure i stedet for en trigger som bliver rekursiv.
Det tyder på at du har ret Kryptos. Jeg kan ikke helt finde ud af, hvor jeg skal indsætte dine sætninger. Kan jeg slå rekursive triggers til fra Enterprise Manager?
Synes godt om
Slettet bruger
23. marts 2006 - 17:01#5
Tror ikke man kan i EM, men du åbner blot en prompt (Query Analyzer) logget på med sa stående i master databasen og så eksekverer
Så er recursive triggers ikke sat korrekt. Den skal returnerer 1.
Noget helt andet, har du overvejet at anvende en Stored-procedure i stedet for - det er jo rent faktisk en rigtig god grund til at det er disabled pr. default. Nemlig at hvis listen bliver stor noget risikerer man et stack overrun.
Ja jeg har flyttet min kode over i en stored procedure. Men nu har jeg lidt svært ved at finde ud af hvordan jeg så får den aktiveret, når der bliver indsat en linie i min tabel ordln
hehe okay det var ikke så svært. Jeg lavede selvfølgelig bare en trigger, der agde EXECUTE
Men nu har jeg så det problem at i min trigger der havde jeg linien:
SELECT @ordrenr=OrdNo FROM inserted
Det kan den ikke finde ud af i en stored procedure, hvordan får jeg fat i mit ordrenummer i den stored procedure?
Synes godt om
Slettet bruger
30. marts 2006 - 12:54#14
Hvis det skal give nogen mening skal du ændre dine inserts og deletes til kald til stored-procedures. Det nytter ikke blot at flytte koden i triggeren til en stored-procedure, så har du præcist sammen problem blot er den indirekte rekursion.
Du har vist efterhånden fået svaret fuldt ud på mit spørgsmål ;-)
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.