SQL Server:创建触发器以将旧值替换为另一个表上的新值

时间:2015-11-27 08:47:26

标签: sql sql-server

我正在使用SQL Server 2008.我想创建一个更新触发器,它将在用户表更新时触发。

触发功能:将user_tbl已更新的手机号码替换为user_work_tbl

CREATE TRIGGER [dbo].[tr_User_Modified]
ON [dbo].[user_tbl]
AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;
    DECLARE @MobileNo varchar(11)

    IF UPDATE (mobile_no) 
    BEGIN
        DECLARE @MobileNo VARCHAR(50)

        SELECT @MobileNo = mobile_no 
        FROM [dbo].user_tbl

        UPDATE [dbo].[user_work_tbl]
        SET mobile_no = @MobileNo 
        WHERE [dbo].[user_work_tbl].mobile_no = @oldMobileNo // here I have a problem
    END 
END;

在评论"这里我遇到了问题"我需要一个在更新前存在于user_tbl中的移动电话号码,以便user_work_tbl的唯一一行得到更新。

也接受任何建议。

感谢您的回复

2 个答案:

答案 0 :(得分:3)

您需要在触发器中将三个表连接在一起 - user_work_tblinserteddeleted。但是,目前还不清楚究竟需要什么条件:

CREATE TRIGGER [dbo].[tr_User_Modified]
ON [dbo].[user_tbl]
AFTER UPDATE
AS BEGIN
SET NOCOUNT ON;

IF UPDATE (mobile_no) 
BEGIN
    UPDATE u
    SET mobile_no=i.mobile_no
    FROM user_work_tbl u
          inner join
         deleted d
          on u.mobile_no = d.mobile_no
          inner join
         inserted i
          on
            i.PKCol = d.PKCol --What's the PK of user_tbl?
END 
END;

inserteddeleted是包含受特定语句影响的新旧行的伪表,并且具有与原始表相同的模式。它们只能在触发器内访问。

另请注意,即使在user_tbl中更新了多个行,上述触发器也是正确的 - 前提是您可以正确关联inserteddeleted在最后的ON条款中。

答案 1 :(得分:0)

您可以从已删除表中获取旧电话号码,从插入中获取新电话号码,但您应该使用用户主键更新行。