【发布时间】:2013-06-17 10:58:10
【问题描述】:
我的架构具有以下结构;
在MPRMain 表中,Status 可以是1(Aprove)、2(Cancel)和3(Pending)。我正在尝试做这样的事情,例如当有人将Status(在 MPRMain 中)更新为 2(Cancel) 时。我想将MPRDetail 表的Status 更新为0(0 表示禁用,1 表示启用)。
所以,我试图为它创建一个触发器,看起来像这样;
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
但是,当我尝试将 MPRMain 的 Status 设置为 2(取消) 从 1(批准) 时,我没有看到任何MPRDetail 表中的更改。这应该将MPRDetail 状态更新为 0(0 表示禁用)。
【问题讨论】:
-
您的第一个问题是您错误地假设触发器每行调用一次 - 事实并非如此。它被称为每个语句一次,并且您的
Inserted表可以(并且将!)包含多行 - 所以你用set @status = (SELECT Status FROM inserted);选择哪一个 - 这是未定义。您需要重写触发器以考虑到Inserted(和Deleted)将包含多行!您需要使用基于集合的方法来处理这些问题 -
@marc_s,您提供的任何示例将不胜感激。我以前没用过触发器。
标签: sql sql-server tsql triggers