创建一个 SQL 触发器来反转之前的触发器
Create a SQL Trigger to reverse a previous Trigger
我正在尝试创建多个触发器。当 Crystal 报告更新同一表单中的(隐藏)字段 'Reprint' 时,一个触发器会更新 'ysnAcknowledged' 字段。如果 'ysnAcknowledged' 字段由用户手动更新(表单复选框),则第二个触发器需要更新 'Reprint' 字段。我有第一个触发器,我的问题是如果我更新 'ysnAcknowledged' 字段,它将触发我的第二个触发器,在我想要它之前有效地反转第一个触发器。
第一个触发器:
CREATE TRIGGER SOPickListReprint
ON dbo.SalesOrder
AFTER UPDATE
AS
IF UPDATE(Reprint)
UPDATE dbo.SalesOrder
SET ysnAcknowledged = 1
第二个触发器:
CREATE TRIGGER SOPickListUpdate
ON dbo.SalesOrder
AFTER UPDATE
AS
IF UPDATE(ysnAcknowledged)
UPDATE dbo.SalesOrder
SET Reprint = 0
CREATE TRIGGER SOPickListUpdate
ON dbo.SalesOrder
AFTER UPDATE
AS
-- Update only rows where Reprint changed or ysnAcknowledged changed
-- > If ysnAcknowledged changed, force Reprint to 0, otherwise leave it as it is
-- > If Reprint changed, force ysnAcknowledged to 1, otherwise leave it as it is
UPDATE
SalesOrder
SET
Reprint = CASE WHEN inserted.ysnAcknowledged <> deleted.ysnAcknowledged THEN 1 ELSE inserted.Reprint END,
ysnAcknowledged = CASE WHEN inserted.Reprint <> deleted.Reprint THEN 0 ELSE inserted.ysnAcknowledged END
FROM
SalesOrder
INNER JOIN
inserted
ON inserted.<primary_key> = SalesOrder.<primary_key>
INNER JOIN
deleted
ON deleted.<primary_key> = SalesOrder.<primary_key>
WHERE
inserted.ysnAcknowledged <> deleted.ysnAcknowledged
OR inserted.Reprint <> deleted.Reprint
我的解决方案:
CREATE TRIGGER SOPickListReprint
ON dbo.SalesOrder
AFTER UPDATE
AS
UPDATE dbo.SalesOrder
SET ysnAcknowledged = CASE WHEN deleted.Reprint = 0 AND inserted.Reprint = 1 THEN 1 ELSE inserted.ysnAcknowledged END,
Reprint = CASE WHEN deleted.ysnAcknowledged = 1 AND inserted.ysnAcknowledged = 0 THEN 0 ELSE inserted.Reprint END
FROM SalesOrder
INNER JOIN
inserted
ON inserted.SalesOrderID = SalesOrder.SalesOrderID
INNER JOIN
deleted
ON deleted.SalesOrderID = SalesOrder.SalesOrderID
我正在尝试创建多个触发器。当 Crystal 报告更新同一表单中的(隐藏)字段 'Reprint' 时,一个触发器会更新 'ysnAcknowledged' 字段。如果 'ysnAcknowledged' 字段由用户手动更新(表单复选框),则第二个触发器需要更新 'Reprint' 字段。我有第一个触发器,我的问题是如果我更新 'ysnAcknowledged' 字段,它将触发我的第二个触发器,在我想要它之前有效地反转第一个触发器。
第一个触发器:
CREATE TRIGGER SOPickListReprint
ON dbo.SalesOrder
AFTER UPDATE
AS
IF UPDATE(Reprint)
UPDATE dbo.SalesOrder
SET ysnAcknowledged = 1
第二个触发器:
CREATE TRIGGER SOPickListUpdate
ON dbo.SalesOrder
AFTER UPDATE
AS
IF UPDATE(ysnAcknowledged)
UPDATE dbo.SalesOrder
SET Reprint = 0
CREATE TRIGGER SOPickListUpdate
ON dbo.SalesOrder
AFTER UPDATE
AS
-- Update only rows where Reprint changed or ysnAcknowledged changed
-- > If ysnAcknowledged changed, force Reprint to 0, otherwise leave it as it is
-- > If Reprint changed, force ysnAcknowledged to 1, otherwise leave it as it is
UPDATE
SalesOrder
SET
Reprint = CASE WHEN inserted.ysnAcknowledged <> deleted.ysnAcknowledged THEN 1 ELSE inserted.Reprint END,
ysnAcknowledged = CASE WHEN inserted.Reprint <> deleted.Reprint THEN 0 ELSE inserted.ysnAcknowledged END
FROM
SalesOrder
INNER JOIN
inserted
ON inserted.<primary_key> = SalesOrder.<primary_key>
INNER JOIN
deleted
ON deleted.<primary_key> = SalesOrder.<primary_key>
WHERE
inserted.ysnAcknowledged <> deleted.ysnAcknowledged
OR inserted.Reprint <> deleted.Reprint
我的解决方案:
CREATE TRIGGER SOPickListReprint
ON dbo.SalesOrder
AFTER UPDATE
AS
UPDATE dbo.SalesOrder
SET ysnAcknowledged = CASE WHEN deleted.Reprint = 0 AND inserted.Reprint = 1 THEN 1 ELSE inserted.ysnAcknowledged END,
Reprint = CASE WHEN deleted.ysnAcknowledged = 1 AND inserted.ysnAcknowledged = 0 THEN 0 ELSE inserted.Reprint END
FROM SalesOrder
INNER JOIN
inserted
ON inserted.SalesOrderID = SalesOrder.SalesOrderID
INNER JOIN
deleted
ON deleted.SalesOrderID = SalesOrder.SalesOrderID