简体   繁体   English

创建一个SQL触发器以反转先前的触发器

[英]Create a SQL Trigger to reverse a previous Trigger

I am trying to create multiple triggers. 我正在尝试创建多个触发器。 One trigger updates the 'ysnAcknowledged' field when the (hidden) field 'Reprint' in the same form gets updated by Crystal Reports. 当Crystal Reports更新相同格式的(隐藏)字段“重新打印”时,一个触发器将更新“ ysnAcknowledged”字段。 The second trigger needs to update the 'Reprint' field if the 'ysnAcknowledged' field is manually updated by the user (form checkbox). 如果用户手动更新了“ ysnAcknowledged”字段,则第二个触发器需要更新“ Reprint”字段(窗体复选框)。 I have the first trigger, my issue is if I update the 'ysnAcknowledged' field, it will trip my second trigger effectively reversing the first trigger before I want it to. 我有第一个触发器,我的问题是,如果更新“ ysnAcknowledged”字段,它将触发我的第二个触发器,有效地反转了我想要的第一个触发器。

1st trigger: 第一个触发条件:

CREATE TRIGGER SOPickListReprint
ON dbo.SalesOrder
AFTER UPDATE
AS

IF UPDATE(Reprint)
UPDATE dbo.SalesOrder
SET ysnAcknowledged = 1

2nd Trigger: 第二次触发:

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

My solution: 我的解决方案:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM