Ich habe mehrere Trigger verwendet, um backward date scheduling
in Sqlserver mit Trigger zu implementieren.Hat Sql Server Trigger die Reihenfolge der Ausführung?
Aber hier ist etwas verdrahtet. hier ist, was ich
bemerktAFTER INSERT
die folgenden drei FelderSHIP BY,A-MOUNT BY,A-POWDER BY
aktualisiert- Wenn ich etwas auf denselben Datensatz ändern und speichern
A-FAB
aktualisiert
- Und zum zweiten Mal, wenn ich etwas auf denselben Datensatz ändern und speichern
A-C\S, A-PRINT BY
aktualisiert
I 3 Mal aktualisieren, müssen alle Felder aktualisiert bekommen
Unten ist die Logik der Rückwärtsplanung. Alle Felder sind miteinander verknüpft
SCHIFF DURCH = CUSTOMER VERSPRACH DATE-1
A-MOUNT BY = SCHIFF VON -1
A-PULVER BY = A-MOUNT BY - 1 oder A-PULVER indem auch gleich Schiff durch Datum -2
A-FAB BY = A-POWDER BY - 1 oder A-FAB von ebenfalls gleich Schiff durch Datum -3
AC/S BY = A-FAB BY OR AC/S BY auch gleich Versanddatum -4
A-CUT BY = AC/S mit -1 oder A-Schnitt ebenfalls gleich Schiff durch Datum -5
/****** Object: Trigger [dbo].[CALC-PROMISED-DATE-AND-SHIPBY] Script Date: 4/6/2017 2:46:01 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[CALC-PROMISED-DATE-AND-SHIPBY]
ON [dbo].[WORKORDERS]
AFTER INSERT, UPDATE
AS
BEGIN
set nocount on
IF TRIGGER_NESTLEVEL() > 1
RETURN
set datefirst 7;
UPDATE T1
[SHIP BY] =
CASE datepart(WEEKDAY, t1.[CALC PROMISED DATE])
WHEN 1 then DateAdd(day, -2, t1.[CALC PROMISED DATE])
WHEN 7 then DateAdd(day, -1, t1.[CALC PROMISED DATE])
ELSE
CASE
WHEN t1.[RE-COMMIT DATE] =Null THEN ISNULL(T1.[PROMISED DATE],Null)
WHEN t1.[RE-COMMIT DATE] is null THEN ISNULL(T1.[PROMISED DATE],Null)
ELSE ISNULL(T1.[RE-COMMIT DATE],Null)
END
END
FROM WORKORDERS T1
INNER JOIN inserted i ON T1.[WORK ORDER #] = i.[WORK ORDER #]
END
A-MOUNT BY
/****** Object: Trigger [dbo].[MOUNTBY] Script Date: 4/6/2017 2:46:54 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[MOUNTBY]
ON [dbo].[WORKORDERS]
AFTER INSERT,UPDATE
AS
BEGIN
IF TRIGGER_NESTLEVEL() > 1
RETURN
set datefirst 7;
UPDATE T1
[A-MOUNT BY] =
case datepart(WEEKDAY, DateAdd(day,-1,t1.[SHIP BY]))
when 7 then DateAdd(day, -2, t1.[SHIP BY])
when 1 then DateAdd(day, -3, t1.[SHIP BY])
else DateAdd(day, -1, t1.[SHIP BY])--t1.[A-C/S BY]-1
END
FROM WORKORDERS T1
INNER JOIN inserted i ON T1.[WORK ORDER #] = i.[WORK ORDER #]
END
A-BY POWDER
/****** Object: Trigger [dbo].[POWDERBY] Script Date: 4/6/2017 2:49:53 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[POWDERBY]
ON [dbo].[WORKORDERS]
AFTER INSERT,UPDATE
AS
BEGIN
IF TRIGGER_NESTLEVEL() > 1
RETURN
set datefirst 7;
UPDATE T1
--SET
SET [A-POWDER BY] =
case datepart(WEEKDAY, t1.[A-MOUNT BY]-1)
when 7 then DateAdd(day, -2, t1.[A-MOUNT BY])
when 1 then DateAdd(day, -3, t1.[A-MOUNT BY])
else t1.[A-MOUNT BY]-1
END
FROM WORKORDERS T1
INNER JOIN inserted i ON T1.[WORK ORDER #] = i.[WORK ORDER #]
END
A-FAB BY
/****** Object: Trigger [dbo].[FABBY] Script Date: 4/6/2017 2:50:23 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[FABBY]
ON [dbo].[WORKORDERS]
AFTER insert, UPDATE
AS
BEGIN
IF TRIGGER_NESTLEVEL() > 1
RETURN
set datefirst 7;
UPDATE T1
SET [A-FAB BY] = case datepart(WEEKDAY, t1.[A-POWDER BY]-1)
when 7 then DateAdd(day, -2, t1.[A-POWDER BY])
when 1 then DateAdd(day, -3, t1.[A-POWDER BY])
else t1.[A-POWDER BY]-1
END
FROM WORKORDERS T1
INNER JOIN inserted i ON T1.[WORK ORDER #] = i.[WORK ORDER #]
END
a-PRINT
VON/****** Object: Trigger [dbo].[PRINTBY] Script Date: 4/6/2017 2:50:50 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[PRINTBY]
ON [dbo].[WORKORDERS]
AFTER INSERT, UPDATE
AS
BEGIN
IF TRIGGER_NESTLEVEL() > 1
RETURN
set datefirst 7;
UPDATE T1
SET [A-PRINT BY] = case datepart(WEEKDAY, t1.[A-FAB BY])
when 7 then DateAdd(day, -2, t1.[A-FAB BY])
when 1 then DateAdd(day, -3, t1.[A-FAB BY])
else t1.[A-FAB BY]-1
END
FROM WORKORDERS T1
INNER JOIN inserted i ON T1.[WORK ORDER #] = i.[WORK ORDER #]
END
A-C/S BY
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[C/SBY]
ON [dbo].[WORKORDERS]
AFTER INSERT,UPDATE
AS
BEGIN
IF TRIGGER_NESTLEVEL() > 1
RETURN
set datefirst 7;
UPDATE T1
--SET
SET [A-C/S BY] = case datepart(WEEKDAY, t1.[A-PRINT BY]-1)
when 7 then DateAdd(day, -2, t1.[A-PRINT BY])
when 1 then DateAdd(day, -3, t1.[A-PRINT BY])
else t1.[A-PRINT BY]-1
END
FROM WORKORDERS T1
INNER JOIN inserted i ON T1.[WORK ORDER #] = i.[WORK ORDER #]
END
A-CUT
VONSET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[CUTBY]
ON [dbo].[WORKORDERS]
AFTER INSERT, UPDATE
AS
BEGIN
IF TRIGGER_NESTLEVEL() > 1
RETURN
set datefirst 7;
UPDATE T1
--SET
SET [A-CUT BY] =
case datepart(WEEKDAY, DateAdd(day,-1,t1.[A-C/S BY]))
when 7 then DateAdd(day, -2, t1.[A-C/S BY])
when 1 then DateAdd(day, -3, t1.[A-C/S BY])
else t1.[A-C/S BY]-1--t1.[A-C/S BY]-1
END
FROM WORKORDERS T1
INNER JOIN inserted i ON T1.[WORK ORDER #] = i.[WORK ORDER #]
END
Ich frage mich, ob seine weil die Ordnung wenn überhaupt da? Wenn i auf einen alle oben genannten Trigger fusionieren nur die SHIP BY
Feld aktualisiert der Rest leer auf null gesetzt
Sie haben keine garantierte Reihenfolge der Ausführung, wenn Sie mehrere Trigger desselben Typs (INSERT, UPDATE, DELETE) in derselben Tabelle haben. Es ist möglich, einen von ihnen als den ersten immer zu spezifizieren, oder einen von ihnen, um immer der letzte zu sein, aber Sie können nicht eine volle Reihenfolge für mehr als diktieren. Ihre Auslöser sollten daher NIEMALS von der Reihenfolge abhängen, in der sie ausgeführt werden. Und ehrlich gesagt, sollte nicht mit den gleichen Daten arbeiten. – pmbAustin
Wir haben das neulich besprochen, als ich gezeigt habe, wie Sie all diese Trigger in einer einzigen Update-Anweisung kombinieren können. http://StackOverflow.com/Questions/43265377/disadvantage-of-having-multiple-triggers-on-the-same-table –
@SeanLange Wenn ich alle Trigger zu einem zusammenführen, wie Sie vorgeschlagen, nur das SHIP BY-Feld alle aktualisiert rest set to blank oder NULL – Joe