SQL插入,更新触发器-您可以更新插入的表吗?
我创建了一个用于INSERT和UPDATE的SQL触发器,它基本上执行以下操作: 从插入的表中获取表的LineID PrimaryID和RegionID,并将其存储在INT变量中。 然后,它对连接表进行检查,以找到RegionID应该是什么,如果RegionID不等于插入表中应该是什么,那么它应该更新该记录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
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总是错误的。我不知道插入表返回行,而不是只有一行:如果你觉得它是有用的,请考虑回答。嗨,我有一个相同的问题,有些人可以帮助我,看到链接嗨所有我有一个相同的问题,有些人可以帮助我,看看链接