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.
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 305758
Url: https://administrator.de/contentid/305758
Ausgedruckt am: 05.11.2024 um 06:11 Uhr
1 Kommentar