2013-07-31 87 views
1

我有一个SQL触发器插入,更新我创建它基本上做以下事情: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表和我做对的更新。但是,你能更新将从插入表插入的行吗?

回答

0

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

+0

你好,我有一个相同的问题,有人可以帮助我,请参阅链接http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26043654?noredirect=1#comment40803473_26043654 – Prathyush

0

我认为问题可能是您正在更新到PurchaceOrderLine内的触发器监视更新到同一张表。尝试改变触发器来监视插入,比如果这样做,你可以做一些改变或者在两个触发器上断开:一个用于插入,另一个用于更新。

+0

感谢您的回复。 – SamoanProgrammer

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演示

+0

感谢您的回复,我正在研究这个问题,并找出了我的逻辑中的一个缺陷,导致条件IF @PurchaserRegionID IS NOT NULL始终为假。我不知道插入的表返回的行,而不是只有一行:) – SamoanProgrammer

+0

如果你觉得它有帮助,请考虑** [接受](http://meta.stackexchange.com/questions/5234/how - 接受答案 - 工作)**答案。 – peterm