sql-server - 如何在 SQL Server 中根据更新查询设置触发器?
问题描述
我试图在电话更新时设置触发器table1
,然后执行检查电话等操作table2
,如果存在,则从中获取员工代码table2
,然后更新员工代码table1
。
我的触发器代码:
CREATE TRIGGER UPDATED_Contact_Trigger
ON table1
AFTER UPDATE
AS
DECLARE @tuid bigint;
DECLARE @phone varchar(15);
DECLARE @employee_code varchar(10);
IF (UPDATE (phone)) --Phone is the Column Name
BEGIN
SELECT @employee_code = i.emp_code
FROM table2 i (nolock)
WHERE i.MOBILE_NO = @phone
UPDATE table1
SET client_code = @employee_code
WHERE tuid= @tuid
END;
此触发器已设置,但table1
即使我更新存在于table2
解决方案
您甚至没有查看代码中的表Inserted
或Deleted
伪表 - 您想知道哪些行已更新?
Inserted
是一个包含所有更新行的伪表 - 它包含更新操作后的新值Deleted
,同时包含相同的行,但具有更新前的旧值。
你需要做这样的事情:
- 加入您
Table1
以Inserted
获取已更新的行(由于您没有显示表结构,我不知道您的主键是什么Table1
- 您需要使用它来加入Inserted
) - 向您添加一个连接
Table2
并选择那些已更新的行,并将这些行限制为Phone
列中已更新的行(通过将Inserted.Phone
值与进行比较Deleted.Phone
)
试试这个代码:
CREATE TRIGGER UPDATED_Contact_Trigger
ON table1
AFTER UPDATE
AS
BEGIN
-- update your base table
UPDATE t1
-- set the client_code to the employee_code from Table2
SET client_code = t2.employee_code
FROM dbo.Table1 t1
-- join to "Inserted" to know what rows were updated - use the primary key
INNER JOIN Inserted i ON t1.(primarykey) = i.(primarykey)
-- join to "Deleted" to check if the "Phone" has been updated (between Deleted and Inserted)
INNER JOIN Deleted d ON i.(primarykey) = d.(primarykey)
-- join to "Table2" to be able to fetch the employee_code
INNER JOIN dbo.Table2 t2 ON t2.mobile_no = t1.phone
-- ensure the "Phone" has changed, between the old values (Deleted) and new values (Inserted)
WHERE i.Phone <> d.Phone;
END;
推荐阅读
- c - 这个程序到底是什么意思?(Shellcoder 手册)
- d3.js - d3 Force Directed Graph General Update Pattern - exit() 选择不起作用
- chatbot - 聊天机器人,什么时候需要 HIPAA
- javascript - React - TypeError:无法读取未定义的属性“道具”
- python - 分类变量分为多列
- php - Ubuntu 允许 www-data 写入新文件
- pandas - 大熊猫六个月的日期范围
- javascript - npm 模块解析失败.....您可能需要适当的加载程序来处理此文件类型
- apache-spark - PySpark SparkSession Builder 与 Kubernetes Master
- python - 想要删除提及时,带有 re.sub 的额外空间