ukulele
Datenbank-Guru
- Beiträge
- 5.251
Mein Trigger, dessen Ziel es ist eine Log Tabelle zu füllen, hat mir ein Rätsel aufgegeben. Es sind noch weitere Trigger auf der Tabelle die teilweise auch wieder in die Tabelle schreiben, daher geht eine Änderung manchmal mit mehreren Update Statements einher, allerdings sind die unten genannten Felder maximal 1x betroffen, warum es eigentlich funktionieren sollte.
Der Trigger (siehe unten) ermittelt scheinbar in irgendeinem dieser Update Statements einen NULL Wert für pk aus INSERTED (übrigens der Primärschlüssel). Er versucht dann auch, in auf_log zu schreiben und da die Tabelle NULL nicht zulässt, kommt hier der Fehler. Ich kann mir aber gar kein Szenario vorstellen, in dem ein FOR UPDATE Trigger in INSERTED keinen Primärschlüssel hat. Daher verstehe ich das ganze irgendwie nicht.
Der Trigger (siehe unten) ermittelt scheinbar in irgendeinem dieser Update Statements einen NULL Wert für pk aus INSERTED (übrigens der Primärschlüssel). Er versucht dann auch, in auf_log zu schreiben und da die Tabelle NULL nicht zulässt, kommt hier der Fehler. Ich kann mir aber gar kein Szenario vorstellen, in dem ein FOR UPDATE Trigger in INSERTED keinen Primärschlüssel hat. Daher verstehe ich das ganze irgendwie nicht.
Code:
CREATE TRIGGER [dbo].[auf_log_update]
ON [dbo].[auf]
FOR UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @pk UNIQUEIDENTIFIER
DECLARE @lastuser VARCHAR(13)
DECLARE @temp_neu VARCHAR(40)
DECLARE @temp_alt VARCHAR(40)
DECLARE @fk_per_bearbeiter_neu UNIQUEIDENTIFIER
DECLARE @typ_neu VARCHAR(20)
DECLARE @fk_per_bearbeiter_alt UNIQUEIDENTIFIER
DECLARE @typ_alt VARCHAR(20)
SELECT @pk = pk,
@fk_per_bearbeiter_neu = fk_per_bearbeiter,
@typ_neu = typ,
@lastuser = lastuser
FROM INSERTED
SELECT @fk_per_bearbeiter_alt = fk_per_bearbeiter,
@typ_alt = typ
FROM DELETED
-- Schlüssel
IF UPDATE(fk_per_bearbeiter)
BEGIN
SET @temp_neu = ( SELECT '#' + cast(id AS VARCHAR(10)) + ': ' + per_nam_kurz
FROM per
WHERE pk = @fk_per_bearbeiter_neu )
SET @temp_alt = ( SELECT '#' + cast(id AS VARCHAR(10)) + ': ' + per_nam_kurz
FROM per
WHERE pk = @fk_per_bearbeiter_alt )
INSERT INTO auf_log( pk,fk_auf,[user],datum,feld,aktion,
wert_neu,wert_key_neu,wert_alt,wert_key_alt)
VALUES( newid(),@pk,@lastuser,getdate(),'FK Bearbeiter','Update',
@temp_neu,@fk_per_bearbeiter_neu,@temp_alt,@fk_per_bearbeiter_alt)
END
-- Zeichen
IF UPDATE(typ)
BEGIN
INSERT INTO auf_log(pk,fk_auf,[user],datum,feld,aktion,wert_neu,wert_alt)
VALUES(newid(),@pk,@lastuser,getdate(),'Kategorie','Update',@typ_neu,@typ_alt)
END
END
GO