INSERTED und DELETED Tabellen

ukulele

Datenbank-Guru
Beiträge
5.107
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.

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
 
Werbung:
Hallo ukulele,

wird der Trigger von einem anderen Trigger aufgerufen?
Ist mehr als eine Zeile durch das Update betroffen?

Bau dir doch eine DEBUG-Tabelle
In die würde ich mir dann einfach mit INSERT-Befehlen in den Triggern und Update-Funktionen z.B. den Wert des PK oder wie viele Zeilen die INSERTED und DELETED Tabellen haben schreiben.

Gruß Charly
 
Werbung:
Ich hab das ganze schon über das Management Studio durch laufen lassen, kriege den Fehler dort auch repliziert. Allerdings ist mir nicht klar, aus welchem Trigger er kommt :-/ In jedem Fall habe ich die Vorstellung, das egal welches Update, die INSERTED Tabelle eigentlich immer den PK beinhalten müsste. Das werde ich aber mal mit nem mehrzeiligen Update testen.
 
Zurück
Oben