我使用多触发器在Sqlserver中使用触发器实现backward date scheduling
。sql服务器触发器是否具有执行顺序?
但是,这里有线正在发生。以下是我注意到
AFTER INSERT
以下三个字段更新SHIP BY,A-MOUNT BY,A-POWDER BY
- 当我改变的东西,以相同的记录和保存
A-FAB
更新 - 而对于第二次当我改变的东西,以相同的记录和保存
A-C\S, A-PRINT BY
更新
我要更新3次得到各方面更新
以下是关于反向调度的逻辑。所有字段是相互关联的
舰=客户的承诺的日期-1
A-MOUNT BY =舰-1
A-粉体= A-MOUNT BY - 1或粉BY也等于船由日期-2
A-FAB BY = A-粉体 - 1 OR A-FAB BY也等于船由日期-3
AC/S BY = A-FAB BY或AC/S BY也等于按日期发货-4
A-CUT BY = AC/S BY -1或A-CUT BY也等于船由日期-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-粉体
/****** 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 BY
/****** 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-削减
SET 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
我想知道如果因为订货,如果有任何?当我合并所有上述触发一个刚刚SHIP BY
场更新了所有剩下的空白设置为null
当您在同一个表上有多个相同类型的触发器(INSERT,UPDATE,DELETE)时,您无法保证执行顺序。可以将其中的一个指定为第一个始终,或者将其中的一个指定为总是最后一个,但对于不止于此,您不能指定完整的订单。因此,你的触发器不应该依赖于它们的运行顺序。坦率地说,不应该使用相同的数据。 – pmbAustin
当我演示如何将所有这些触发器组合到一个更新语句中时,我们讨论了这一点。 http://stackoverflow.com/questions/43265377/disadvantage-of-having-multiple-triggers-on-the-same-table –
@SeanLange当我合并所有触发器到一个,因为你建议只是船舶BY字段更新所有其余设置为空白或NULL – Joe