SQL插入,更新触发器 - 您可以更新插入的表吗?

时间:2013-07-31 03:07:46

标签: sql sql-server triggers insert

我有一个SQL触发器FOR INSERT,我创建的更新基本上执行以下操作:

获取LineID(表的PrimaryID)和RegionID从Inserted表中获取并将其存储在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表中插入的行吗?

3 个答案:

答案 0 :(得分: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 演示

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

相关问题