Sql server 如何在SQL Server中设置基于更新查询的触发器?

Sql server 如何在SQL Server中设置基于更新查询的触发器?,sql-server,triggers,Sql Server,Triggers,每当在表1中更新电话时,我会尝试设置触发器,然后执行类似于从表2检查电话的操作,如果存在,则从表2中提取员工代码,然后更新表1中的员工代码 我的触发器代码: CREATE TRIGGER UPDATED_Contact_Trigger ON table1 AFTER UPDATE AS DECLARE @tuid bigint; DECLARE @phone varchar(15); DECLARE @employee_code varchar(10); I

每当在
表1
中更新电话时,我会尝试设置触发器,然后执行类似于从
表2
检查电话的操作,如果存在,则从
表2
中提取员工代码,然后更新
表1
中的员工代码

我的触发器代码:

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;

此触发器已设置,但即使我更新了
表2中的联系人,也不会更新
表1
,您甚至没有查看代码中插入的
或删除的
伪表-您想如何知道哪些行已更新

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

您需要这样做:

  • Table1
    连接到
    Inserted
    以获取更新的行(由于您没有显示表结构,我无法知道
    Table1
    上的主键是什么-您需要使用它连接到
    Inserted
  • 表2
    中添加一个连接,并选择已更新的行,并将这些行限制在
    电话
    列中已更新的行(通过将
    插入的.Phone
    值与
    已删除的.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;
创建触发器已更新\u联系人\u触发器
关于表1
更新后
作为
开始
--更新基表
更新t1
--将客户代码设置为表2中的员工代码
设置客户代码=t2。员工代码
来自dbo.table1t1
--加入“Inserted”以了解更新了哪些行-使用主键
在t1上插入的内部联接i.(主密钥)=i.(主密钥)
--加入“已删除”以检查“手机”是否已更新(在已删除和已插入之间)
i.(主密钥)=d.(主密钥)上删除的内部联接d
--加入“Table2”以获取员工代码
内部连接dbo.Table2 t2在t2.mobile_no=t1.phone上
--确保“电话”在旧值(已删除)和新值(已插入)之间已更改
其中i.电话d.电话;
结束;

您甚至没有查看代码中插入的
或删除的
伪表-您想如何知道哪些行已更新

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

您需要这样做:

  • Table1
    连接到
    Inserted
    以获取更新的行(由于您没有显示表结构,我无法知道
    Table1
    上的主键是什么-您需要使用它连接到
    Inserted
  • 表2
    中添加一个连接,并选择已更新的行,并将这些行限制在
    电话
    列中已更新的行(通过将
    插入的.Phone
    值与
    已删除的.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;
创建触发器已更新\u联系人\u触发器
关于表1
更新后
作为
开始
--更新基表
更新t1
--将客户代码设置为表2中的员工代码
设置客户代码=t2。员工代码
来自dbo.table1t1
--加入“Inserted”以了解更新了哪些行-使用主键
在t1上插入的内部联接i.(主密钥)=i.(主密钥)
--加入“已删除”以检查“手机”是否已更新(在已删除和已插入之间)
i.(主密钥)=d.(主密钥)上删除的内部联接d
--加入“Table2”以获取员工代码
内部连接dbo.Table2 t2在t2.mobile_no=t1.phone上
--确保“电话”在旧值(已删除)和新值(已插入)之间已更改
其中i.电话d.电话;
结束;

在您了解后果、预测和处理问题并有充分理由使用之前,请不要乱扔代码。请注意,您是如何根据“@tuid”进行更新的,但从不设置它的。这就是为什么应该为涉及的表提供DDL的原因之一。除了您之外,没有人知道您的模式和表之间的关系。此代码有太多问题,很难启动。让我们使用更新函数。许多人认为,当值更改时,这会返回真值。实际情况是,当该列位于update语句中时,它返回true。它可能包含相同的值。您不能引用已插入或已删除的。你有标量变量。这通常是作者不理解的一个迹象,即触发每个操作一次,而不是每行一次。为什么要更新正在更新的表中的另一列,使其与另一列具有相同的值?不要乱扔你的代码,直到你了解后果,预测和处理问题,并有充分的理由使用它。注意这里你是如何根据“@tuid”更新的,但从不设置它的。这就是为什么应该为涉及的表提供DDL的原因之一。除了您之外,没有人知道您的模式和表之间的关系。此代码有太多问题,很难启动。让我们使用更新函数。许多人认为,当值更改时,这会返回真值。实际情况是,当该列位于update语句中时,它返回true。它可能包含相同的值。您不能引用已插入或已删除的。你有标量变量。这通常是作者不理解的一个迹象,即触发每个操作一次,而不是每行一次。为什么要更新正在更新的表中的另一列,使其与另一列具有相同的值?