ticar
Goto Top

Trigger Verständnis

Hi

ich bräuchte mal Hilfe bei einem Trigger bei einem MSSQL 2012R2 Datenbankserver, bei dem ich das Verhalten nicht verstehe:

Ich habe folgenden Trigger gebaut, um Prüfung über die Datumseingabe und eines doppelten Datensatzes zu verhindern. Ich weiß, dass man doppelte Datensätze anders lösen könnte (Unique Key), mir geht es aber hier um das Verständnis.

1: ALTER trigger [dbo].[uti_tm_kond_kunde] on [dbo].[tm_kond_kunde] for insert as
2: begin
3: declare
4: @maxcard  int,
5: @numrows  int,
6: @numnull  int,
7: @errno    int,
8: @errmsg   varchar(255)
9: 
10: select  @numrows = @@rowcount
11: if @numrows = 0
12: return
13: 
14: if (SELECT count(*) FROM inserted t2 WHERE t2.kond2_gueltig_von IS NULL OR t2.kond2_gueltig_bis IS NULL ) > 0
15: begin
16: 		select @errno  = 300098,
17:		@errmsg = 'ACHTUNG: Preiskonditionen ohne gültiges Datum sind ungültig!'  
18:		goto error
19: end
20: 
21: /* dies sind nur Prüfzeilen */
22: declare @adk_id int,
23: 		@pg_id int,
24: 		@counter int
25: 
26: SELECT @adk_id = adk_id, @pg_id = pg_id FROM inserted
27: print @adk_id
28: print @pg_id 
29: 
30: SELECT @counter = count(*) FROM tm_kond_kunde WHERE adk_id = @adk_id AND pg_id = @pg_id 
31: print @counter
32: /* Prüfzeilen Ende */
33: 
34: /* Hier fängt mein Problem an */
35: if ( SELECT count(*) FROM dbo.tm_kond_kunde t1, inserted t2 WHERE t1.adk_id = t2.adk_id AND t1.pg_id = t2.pg_id AND t1.kond2_gueltig_von <= GETDATE() AND t1.kond2_gueltig_bis >= GETDATE() AND t2.kond2_gueltig_von <= GETDATE() AND t2.kond2_gueltig_bis >= GETDATE()  ) > 0
36: begin
37: 		select @errno  = 300099,
38: 		@errmsg = 'ACHTUNG: Doppelter Rabattsatz darf nicht angelegt werden!'  
39: 		goto error
40: end
41: 
42: return
43: 
44: error:
45: throw  @errno, @errmsg, 1;
46: rollback  transaction
47: end
Interessanter weise ergibt die Zeile 31 den Wert 1, was ich nicht verstehe, da der Datensatz ja eigentlich noch gar nicht in der Tabelle stehen dürfte, da er ja gerade erst eingefügt wird. Folglich geht die darauf folgende if Abfrage in Zeile 35 in die Errormessage, was aber eigentlich nicht sein sollte, da der Datensatz ja noch gar nicht eingefügt ist und danach dem Rollback auch nicht in der DB steht.
Ich kann natürlich den Wert für die Zeile 35 von > 0 auf > 1 setzen und habe damit das Problem umgangen, aber mir geht es um das Verständnis, wieso der Datensatz über ein Ergebnis 1 liefert.

Wäre super, wenn hier jemand helfen könnte.

Gruß,
Lars

Content-ID: 305758

Url: https://administrator.de/contentid/305758

Ausgedruckt am: 24.11.2024 um 08:11 Uhr

TiCar
TiCar 31.05.2016 um 10:20:37 Uhr
Goto Top
Ok,
nach intensivem studieren der Triggerbeschreibung bin ich mit dem Kollegen zu dem Ergebnis gekommen, dass der Trigger ein AFTER Trigger ist und somit der Datensatz in der DB schon geschrieben wurde.

=> Lösung die ich ja schon verwende ist dann in der IF-Abfrage > 1 abzufragen statt >0