首页 > 解决方案 > 如何在 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

标签: sql-servertriggers

解决方案


您甚至没有查看代码中的表InsertedDeleted伪表 - 您想知道哪些行已更新?

Inserted是一个包含所有更新行的伪表 - 它包含更新操作后的新值Deleted,同时包含相同的行,但具有更新前的旧值

你需要做这样的事情:

  • 加入您Table1Inserted获取已更新的行(由于您没有显示表结构,我不知道您的主键是什么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;

推荐阅读