1

我有一个 SQL 触发器 FOR INSERT, UPDATE 我创建了它基本上执行以下操作:

从 Inserted 表中获取 LineID(表的 PrimaryID)和 RegionID,并将其存储在 INT 变量中。然后它会检查连接表以查找 RegionID 应该是什么,如果 RegionID 不等于它应该来自 Inserted 表的值,那么它应该更新该记录。

CREATE TRIGGER [dbo].[TestTrigger]
ON [dbo].[PurchaseOrderLine]
FOR INSERT, UPDATE
AS

-- Find RegionID and PurchaseOrderLineID
DECLARE @RegionID AS INT
DECLARE @PurchaseOrderLineID AS INT
SELECT @RegionID = RegionID, @PurchaseOrderLineID = PurchaseOrderLineID FROM Inserted

-- Find PurchaserRegionID (if any) for the Inserted Line
DECLARE @PurchaserRegionID AS INT
SELECT @PurchaserRegionID = PurchaserRegionID
FROM 
(...
    ) UpdateRegionTable 
WHERE UpdateRegionTable.PurchaseOrderLineID = @PurchaseOrderLineID

-- Check to see if the PurchaserRegionID has a value
IF @PurchaserRegionID IS NOT NULL
BEGIN
-- If PurchaserRegionID has a value, compare it with the current RegionID of the Inserted PurchaseOrderLine, and if not equal then update it
IF @PurchaserRegionID <> @RegionID
BEGIN
    UPDATE PurchaseOrderLine
    SET RegionID = @PurchaserRegionID
    WHERE PurchaseOrderLineID = @PurchaseOrderLineID
END 
END

我遇到的问题是它没有更新记录,我猜,这是因为该记录尚未插入到 PurchaseOrderLine 表中,我正在对此进行更新。但是你能更新从 Inserted 表中插入的行吗?

4

3 回答 3

1

触发器的主要问题是它是在假设您总是在INSERTED虚拟表中只获得一行的情况下编写的。

SQL Server 触发器是语句触发器而不是行触发器。你必须考虑到这个事实。

现在,如果我正确理解了这个触发器背后的逻辑,那么你只需要一个更新语句

CREATE TRIGGER TestTrigger ON PurchaseOrderLine
FOR INSERT, UPDATE
AS
  UPDATE l
     SET RegionID = u.PurchaserRegionID
    FROM PurchaseOrderLine l JOIN INSERTED i
      ON l.PurchaseOrderLineID = i.PurchaseOrderLineID JOIN 
         (
           SELECT PurchaseOrderLineID, PurchaserRegionID 
             FROM UpdateRegionTable  -- !!! change this for your proper subquery
         ) u ON l.PurchaseOrderLineID = u.PurchaseOrderLineID

对于这个例子,我创建了一个假表UpdateRegionTable。您必须将其更改为返回的正确查询PurchaseOrderLineID, PurchaserRegionID(在您的代码中将其替换为...)。确保它返回所有必要的行,而不是一个

这是SQLFiddle演示

于 2013-07-31T03:57:42.080 回答
0

我认为问题可能是您正在PurchaceOrderLine对触发器内部进行更新,该触发器也在监视同一张表的更新。尝试更改触发器以仅监视插入,如果这样有效,您可以进行一些更改或在两个上中断触发器:一个用于插入,另一个用于更新。

于 2013-07-31T03:30:35.143 回答
0

这已解决。我通过将触发器添加到另一个表来解决问题,因为 IF @PurchaserRegionID IS NOT NULL 始终为假。

于 2013-08-05T03:01:11.873 回答