none
Kann mir jemand bei einem Trigger helfen? RRS feed

  • Frage

  • Hallo und danke für's reinschauen...

    Ich würde gerne eine Änderung in einer extra dafür vorgesehen Spalte sehen. Ungefähr so:

    ID Name Change

    1 Name1 0

    2 Name2 0

    ...

    Jetzt ändere ich etwas und es sieht dann so aus:

    ...

    1 Name1 0

    2 Name3 1

    ...

    Kann mir jemand helfen? Ich weiß nicht mal wo ich ansetzen soll...

    Für einen guten Beispiel wäre ich dankbar.

    Freitag, 15. April 2016 12:53

Antworten

  • Hallo Eugen,

    so ganz verstanden hab ich's irgendwie nicht. Aber ich versuchs mal:

    Du willst in der Spalte "Change" den Wert 1 setzen, wenn sich irgendwas am Datensatz ändert?

    CREATE TRIGGER trg_Update_TestTable
       ON  dbo.TestTable
       AFTER UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for trigger here
        UPDATE TestTable SET Change = 1 WHERE ID IN ( SELECT ID FROM inserted )
    
    END

    Es gibt sicher Konstellationen, in denen das dazu führt, dass durch das nochmalige UPDATE der Trigger wieder ausgeführt wird aber ich find die Option dazu grade nicht mehr :)

    Wenn man sicherstellen will, dass es nicht passiert, dann bspw. so:

    CREATE TRIGGER trg_Update_TestTable
       ON  dbo.TestTable
       AFTER UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Nur ausführen, wenn die Spalte "Change" nicht aktualisiert wurde
        IF NOT UPDATE( Change )
        BEGIN
            PRINT 'Trigger executed'
            UPDATE TestTable_Test SET Change = 1 WHERE ID IN ( SELECT ID FROM inserted )
        END
    
    END


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 15. April 2016 14:12
    Moderator

Alle Antworten

  • Hallo Eugen,

    so ganz verstanden hab ich's irgendwie nicht. Aber ich versuchs mal:

    Du willst in der Spalte "Change" den Wert 1 setzen, wenn sich irgendwas am Datensatz ändert?

    CREATE TRIGGER trg_Update_TestTable
       ON  dbo.TestTable
       AFTER UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for trigger here
        UPDATE TestTable SET Change = 1 WHERE ID IN ( SELECT ID FROM inserted )
    
    END

    Es gibt sicher Konstellationen, in denen das dazu führt, dass durch das nochmalige UPDATE der Trigger wieder ausgeführt wird aber ich find die Option dazu grade nicht mehr :)

    Wenn man sicherstellen will, dass es nicht passiert, dann bspw. so:

    CREATE TRIGGER trg_Update_TestTable
       ON  dbo.TestTable
       AFTER UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Nur ausführen, wenn die Spalte "Change" nicht aktualisiert wurde
        IF NOT UPDATE( Change )
        BEGIN
            PRINT 'Trigger executed'
            UPDATE TestTable_Test SET Change = 1 WHERE ID IN ( SELECT ID FROM inserted )
        END
    
    END


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 15. April 2016 14:12
    Moderator
  • Vielen Dank Stefan. Ich werde es ausprobieren. Ich wusste nicht, wie ich auf die Zeile zugreifen soll, die gerade ein Update erfährt... Aber dank Dir weis ich es jetzt. Danke.
    Freitag, 15. April 2016 15:59
  • Hallo Eugen,

    bedenke, dass es nicht immer nur eine Zeile in den inserted und deleted Hilfstabellen gibt. Wenn man bspw. ein UPDATE Tabelle SET Feld = 123 absetzt, kommen alle betroffenen Datensätze in inserted und deleted vor.

    Kurze Erklärung zu den Hilfstabellen:

    inserted => beinhaltet die per INSERT oder UPDATE hinzugefügten/aktualisierten Daten. Im Falle von UPDATE also die Daten, nachdem das UPDATE Statement ausgeführt wurde.

    deleted => beinhaltet die per UPDATE oder DELETE gelöschten Daten. Im Falle von UPDATE also die Daten, bevor das UPDATE Statement ausgeführt wurde.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort vorgeschlagen Benjamin.Hoch Samstag, 16. April 2016 10:17
    Freitag, 15. April 2016 16:52
    Moderator
  • Hallo Stefan,

    habe das jetzt so drin:

    USE [CS_DataBase]
    GO
    
    /****** Object:  Trigger [CS].[trg_Update_Object_I]    Script Date: 16.04.2016 11:12:32 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TRIGGER [CS].[trg_Update_Object_I]
       ON  [CS].[Object_I]
       AFTER UPDATE
    AS 
    BEGIN
    	SET NOCOUNT ON;
    
        -- Nur ausführen, wenn die Spalte "Change" nicht aktualisiert wurde
        IF NOT UPDATE( [Changed] )
        BEGIN
            PRINT 'trg_Update_Object_I ist aktiv'
            UPDATE [CS].[Object_I] SET [Changed] = 1, [Change_TS] = CURRENT_TIMESTAMP WHERE ID IN ( SELECT ID FROM inserted )
        END
    
    END
    GO

    Und das tutet, was mich unheimlich freut!

    Ich danke Dir. Selber würde ich vermutlich drei Tage dran sitzen... Aber dein Antwort war echt kurz, gut und bündig. Ist keine Selbstverständlichkeit. Was ich in Forums so erlebe... :-)

    Samstag, 16. April 2016 09:16