1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

INSERTED und DELETED Tabellen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von ukulele, 31 März 2011.

  1. ukulele

    ukulele Datenbank-Guru

    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
     
  2. Charly

    Charly Datenbank-Guru

    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
     
  3. ukulele

    ukulele Datenbank-Guru

    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.
     

Diese Seite empfehlen