【问题标题】:SQL Insert, Update Trigger - Can you update the inserted table?SQL 插入,更新触发器 - 你能更新插入的表吗?
【发布时间】:2013-07-31 03:07:45
【问题描述】:

我创建了一个 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 表中插入的行吗?

【问题讨论】:

    标签: sql sql-server triggers insert


    【解决方案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演示

    【讨论】:

    • 感谢您的回复,我正在解决这个问题并发现了我的逻辑中的一个缺陷,导致条件 IF @PurchaserRegionID IS NOT NULL 始终为假。我不知道插入的表返回行而不仅仅是一行:)
    • 如果您觉得有帮助,请考虑到 accept 回答。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。
    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多