首页 > 解决方案 > SQL Server 触发器更改不同的表

问题描述

如果它在表 A 的列中找到信息,我正在尝试创建一个触发器来更改表​​ B 中的列的值。

我的数据库示例如下:

[表A],项目ID

[TableB],itemID itemInStock

一旦用户在表 A 中创建了一个声明 an 的条目itemID,触发器需要将TableB.itemInStock列更改为“是”</p>

我还在学习 SQL,如果我遗漏了什么,请原谅,如果您需要更多信息,请告诉我。

我知道有更好的方法可以做到这一点,但有人告诉我我需要使用触发器来做到这一点。

我尝试了一些不同的事情,但是因为它没有任何工作,下面是我当前的解决方案,但是这会将所有itemInStock行更新为“是”,因为我只希望那些更新TableB.itemID与输入的 itemID 匹配的位置TableA.

 ALTER TRIGGER [itemAvailability] ON  [dbo].[TableA] FOR
 INSERT
 AS 
    BEGIN
     UPDATE [dbo].[TableB] set itemInStock = 'Yes' WHERE 
        TableB.itemID = itemID
  END

标签: sql-server

解决方案


两个问题——

  1. 您没有查看包含新插入行的 Inserted 伪表

  2. 您假设触发器每行调用一次 - 情况并非如此,触发器每条语句调用一次,并且 Inserted 伪表将包含多行 - 您需要处理

因此,您的代码应如下所示 -

ALTER TRIGGER [itemAvailability] ON  [dbo].[TableA]
FOR INSERT
AS
UPDATE TB
SET itemInStock = 'Yes'
FROM [dbo].[TableB] TB JOIN inserted I
on TB.itemID = I.itemID

推荐阅读