我使用多觸發器在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