sql-server - 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
解决方案
两个问题——
您没有查看包含新插入行的 Inserted 伪表
您假设触发器每行调用一次 - 情况并非如此,触发器每条语句调用一次,并且 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
推荐阅读
- javascript - 为什么检查的伪类在 css 中不起作用?
- java - 将霍夫曼编码的字符串写入Java文件时如何处理奇数字节?
- python - 测试列表中所有可能性的程序
- javascript - 如何在不知道调用者函数的情况下拦截 javascript 中的 api 调用?
- java - 将依赖项复制到 gradle 中的 libs 文件夹
- linux - Sublime Text:[Errno 2] 没有这样的文件或目录:'gopls'
- html - 将所有输入、标签和选择元素居中
- amazon-dynamodb - aws dynamodb 查询包含特殊字符的属性值?
- laravel - Laravel Postgres SQLSTATE [42601]:语法错误:7 错误:“”“”处或附近的零长度分隔标识符
- c++ - 即使所有数组都被删除 C++,内存仍然泄漏