3

我有以下结构的架构; 在此处输入图像描述
MPRMain表中,Status可以是1(Aprove)、2(Cancel) 和 3(Pending)。我正在尝试做这样的事情,例如当有人将Status(in MPRMain) 更新为2(Cancel)时。我想将表的更新为Status0 (0 表示禁用,1 表示启用)。 所以,我试图为它创建一个触发器,看起来像这样;MPRDetail

Alter Trigger Inventory.MprMainUpdate
    ON Inventory.MPRMain
    AFTER UPDATE
AS
BEGIN 

    declare @status as int;
    set @status = (SELECT Status FROM inserted);
    if(@status=2)
    BEGIN
        UPDATE Inventory.MPRDetail
        SET Status = 0   -- update the status to canceled
        WHERE MPRId = (select MPRId from inserted);
    END

END

但是,当我尝试将Statusa设置MPRMain2 (Cancel) From 1 (Aprove)时,我在MPRDetail表中看不到任何更改。这应该将MPRDetail状态更新为 0(0 表示禁用)。

4

1 回答 1

2

由于Inserted可以包含多行,因此您需要使用基于集合的方法编写触发器:

ALTER TRIGGER Inventory.MprMainUpdate
    ON Inventory.MPRMain AFTER UPDATE
AS
BEGIN 
  UPDATE Inventory.MPRDetail
  SET Status = 0
  FROM Inserted i
  WHERE i.Status = 2 AND Inventory.MPRDetail.MPRId = i.MPRId;
END

所以基本上你需要将你的实际数据表与Inserted基于MPRId列的伪表连接起来,并将基表中的所有行更新到Status = 0whereInserted.Status = 2

好的 - 我开始了:假设您的UPDATE语句更新了四行,那么Inserted在您的触发器中可能看起来像这样:

MPRId  MprNo  Date  DepartmentId  Status
  1      42     ..    .......        1
  2      43     ..    .......        2
  7      33     ..    .......        7
  9      41     ..    .......        2

现在,您JOIN将这组数据与您的表相对应,您只选择in为 2MPRDetail的那些行- 所以您得到StatusInserted

MPRId  Status  MPRDetail.Status  (other columns of MPRDetail for those values)
  2      2           4           .....................................
  9      2           5           .....................................

所以在这种情况下,这两个行MPRDetail都会Status在触发器内更新为 0 - 任何其他行都不会被触及。

这会让事情变得更清楚吗?如果不是:你被困在哪里,什么仍然是“魔法”,因此你不清楚?

于 2013-06-17T11:05:04.477 回答