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

SQL插入,更新触发器-您可以更新插入的表吗?,sql,sql-server,triggers,insert,Sql,Sql Server,Triggers,Insert,我创建了一个用于INSERT和UPDATE的SQL触发器,它基本上执行以下操作: 从插入的表中获取表的LineID PrimaryID和RegionID,并将其存储在INT变量中。 然后,它对连接表进行检查,以找到RegionID应该是什么,如果RegionID不等于插入表中应该是什么,那么它应该更新该记录 CREATE TRIGGER [dbo].[TestTrigger] ON [dbo].[PurchaseOrderLine] FOR INSERT, UPDATE AS -- Find

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

从插入的表中获取表的LineID PrimaryID和RegionID,并将其存储在INT变量中。 然后,它对连接表进行检查,以找到RegionID应该是什么,如果RegionID不等于插入表中应该是什么,那么它应该更新该记录

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表中,我正在对其进行更新。但是,您能否更新将从插入的表中插入的行?

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

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

您的触发器的主要问题是,它是在假定插入的虚拟表中始终只有一行的情况下编写的

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

现在,如果我正确理解了这个触发器背后的逻辑,那么您只需要在其中包含一条update语句

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
对于这个示例,我创建了一个假的表updateRegionable。您必须将其更改为在代码中返回PurchaseOrderLineID、PurchaserRegionID的正确查询,并将其替换为。。。。确保它返回所有必需的行,而不是一行


这里是演示

触发器的主要问题是,它是在假定插入的虚拟表中始终只有一行的情况下编写的

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

现在,如果我正确理解了这个触发器背后的逻辑,那么您只需要在其中包含一条update语句

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
对于这个示例,我创建了一个假的表updateRegionable。您必须将其更改为在代码中返回PurchaseOrderLineID、PurchaserRegionID的正确查询,并将其替换为。。。。确保它返回所有必需的行,而不是一行


这里是演示

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

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

感谢您的回复。感谢您的回复。感谢您的回复,我正在解决这个问题,并且发现了我的逻辑中的一个缺陷,这导致了条件IF@PurchaserRegionID不为NULL总是为false。我不知道插入表返回行,而不只是一行:如果您觉得它是有用的,请考虑回答。谢谢您的响应,我正在研究这个问题,并找出了我的逻辑中的一个缺陷,这导致了条件if @ PurchaserRegionID不是NULL总是错误的。我不知道插入表返回行,而不是只有一行:如果你觉得它是有用的,请考虑回答。嗨,我有一个相同的问题,有些人可以帮助我,看到链接嗨所有我有一个相同的问题,有些人可以帮助我,看看链接