我有一个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表中插入的行吗?
答案 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。