当前位置: 首页 > 知识库问答 >
问题:

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

查宜民
2023-03-14

我创建了一个用于插入和更新的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表中,我正在对其进行更新。但是您能更新将从插入的表中插入的行吗?

共有3个答案

方兴旺
2023-03-14

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

田佐
2023-03-14

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

周阳成
2023-03-14

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

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

在这个例子中,我创建了一个假表UpdateRegonTable。您必须将其更改为返回PurchaseOrderLineID的正确查询(在您的代码中,您将其替换为...)。确保它返回所有必要的行,而不是一行。

这里是SQLFiddle演示

 类似资料:
  • 问题内容: 这是我想做的事情: 当表中有新记录时,我需要通过设置以表示特定(旧)帐户已被编辑来更新where =中的行。 要求 不是 我要操纵 新插入的 列,而是要使用一个 已经存在的 列 但是,我无法更新同一张表: 请提出解决方法 PS:我已经走过了更新表触发器在同一个表更新后,插入到相同的表触发的mysql,更新与后同桌INSERT触发器和表后插入MySQL的触发器与插入和更新,但他们似乎没有

  • 问题内容: 我的数据库中有一个计算,需要在更新触发器之后为“ table1”更新“ field1”。 更新该字段的问题将导致更新后触发器触发并执行冗长的过程并显示错误。 请告知在执行“更新后”触发器之后如何使“ field1”更新,而又不使“更新后”触发器再次执行。 我知道我不能将After触发器与NEW配合使用。 谢谢 问题答案: 可以使用基于上下文变量的自定义锁定机制,以防止重复调用AFTER

  • 问题内容: 我有两个表,其中一个命名如下 另一个表具有以下字段: SID CID Per 如何为以下内容编写触发器: 如果表h1-h0的任何字段中发生 更新,则使用以下值更新表中的列: ((总数为1s-总数为0s / (总数1s +总数0s))/ 100 在此先感谢 我开发了一个触发器,但是它不起作用,它在第11行说了错误,您能说出什么问题吗? 问题答案: 在定义触发器之前,请确保更改定界符。另外

  • 以下是我想做的: 当表中有新的 时,我需要通过设置 ' 来更新中的行 = ,以表示特定(旧)帐户已被编辑。 要求不是操作新插入的列,而是使用< code>pk = NEW.edit_on操作已经存在的列 但是,我无法更新同一个表: 请建议一个解决方法 PS:我已经完成了更新同一表后在触发器中更新表、插入到同一表中触发器mysql、在同一表上用插入后触发器更新以及在表上用Insert和update在

  • 问题内容: 我有一个表orderDetails,其中包含订单的产品 productId color size quantity 和一桌股票 productId size color stock 订单完成后,我将使用此查询在表格中插入商品 然后我在表上有一个触发器: 通过此触发器,我想减少库存,但是只有第一个产品受到影响,其他数量保持不变。 我想念什么? 谢谢你。 问题答案: 要点是:您假设将为插入

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?