Benutzer mit den meisten Antworten
Kann mir jemand bei einem Trigger helfen?

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.
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
- Bearbeitet Stefan FalzModerator Freitag, 15. April 2016 14:25
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 16. April 2016 12:43
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 26. April 2016 09:10
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
- Bearbeitet Stefan FalzModerator Freitag, 15. April 2016 14:25
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 16. April 2016 12:43
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 26. April 2016 09:10
-
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
-
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... :-)