Die Transaktion ist im Auslöser beendet. Batch wurde abgebrochen. Abgeleitete Attribute

Ich habe diesen Auslöser:

CREATE trigger [dbo].[DeriveTheAge] on [dbo].[Student] after insert,update as begin declare @sid as int; declare @sdate as date; select @sid= [Student ID] from inserted; select @sdate=[Date of Birth] from inserted; commit TRANSACTION if(@sdate is not null) begin update Student set Age=DATEDIFF(YEAR,@sdate,GETDATE()) where [Student ID]=@sid; end print 'Successfully Done' end 

Wie es vorschlägt, berechnet der Auslöser automatisch das abgeleitete Attribut "Alter" ab dem Geburtsdatum. Aber ich bekomme diesen Fehler, wenn ich die Einfügung mache:

 (1 row(s) affected) Successfully Done Msg 3609, Level 16, State 1, Line 1 The transaction ended in the trigger. The batch has been aborted. 

Zuerst habe ich diesen Fehler vermieden, weil die Zeilen trotz des Fehlers aktualisiert wurden. Aber jetzt, wenn ich einen datasatz aus dem FORNT END einfügte, wird der datasatz nicht aktualisiert. Stattdessen wirft es diese exception aus: Bildbeschreibung hier eingeben

Kann mir bitte jemand weiterhelfen?

btw, Mine ist SQL server 2008 R2 und Visual Studio 2010.

CORRECTION : Die Records werden immer noch aktualisiert. Aber die exception ist der Vilan.

Aktualisieren

 CREATE TRIGGER [dbo].[DeriveTheAge] ON [dbo].[Student] FOR INSERT, UPDATE AS BEGIN UPDATE s SET Age = DATEDIFF(YEAR, [Date of Birth], CURRENT_TIMESTAMP) FROM dbo.Student AS s INNER JOIN inserted AS i ON s.[Student ID] = i.[Student ID] WHERE i.[Date of Birth] IS NOT NULL; commit transaction END GO 

Solutions Collecting From Web of "Die Transaktion ist im Auslöser beendet. Batch wurde abgebrochen. Abgeleitete Attribute"

Warum begehen Sie im Auslöser? Warum behandeln Sie nicht mehrzeilige Einsätze oder Updates? Sie können nicht einfach variables deklarieren und ihnen von eingefügten zuordnen – welche Werte werden Sie bei der Aktualisierung von 2 oder 15 oder 6000 Zeilen erhalten?

 CREATE TRIGGER [dbo].[DeriveTheAge] ON [dbo].[Student] FOR INSERT, UPDATE AS BEGIN UPDATE s SET Age = DATEDIFF(YEAR, [Date of Birth], CURRENT_TIMESTAMP) FROM dbo.Student AS s INNER JOIN inserted AS i ON s.[Student ID] = i.[Student ID] WHERE i.[Date of Birth] IS NOT NULL; END GO 

Das alles sagte, warum auf der Erde würdest du einen Auslöser brauchen, um jemandes Alter zu berechnen? Sie können dies aus dem Geburtsdatum sofort zur Abfrage time und wissen, dass es genau sein wird, im Gegensatz zu diesem abgestandenen Wert, den Sie in der Tabelle gespeichert haben. Beachten Sie, dass, wenn ihre Zeile nicht für mehr als ein Jahr aktualisiert wird, das Alter, das Sie in die Tabelle gesetzt haben, ist nicht mehr aktuell. Wann gehst du zurück und aktualisst das Alter für alle Zeilen in der Tabelle? Einmal am Tag? Alles weniger und deine Altersspalte ist völlig unzuverlässig und sinnlos.

Auch DATEDIFF(YEAR ist kein zuverlässiger path, um das Alter an erster Stelle zu berechnen. Alles, was es tut, zählt die Anzahl der Jahresgrenzen, die gekreuzt worden sind, es hat keine Ahnung, ob der persönliche Geburtstag der Person Jan 1 oder 31.12 oder irgendwo ist zwischen.

Schließlich würde ich nicht aus dem Auslöser drucken. Wer wird diese printingerklärung verbrauchen, wenn du nicht debugst?