更新触发器以更新另一个表中的记录

时间:2015-05-16 09:29:02

标签: sql sql-server-2008 triggers

我有User_Table

CREATE TABLE [dbo].[User_TB]
  (
    [User_Id] [varchar](15) NOT NULL,
    [User_FullName] [varchar](50) NULL,
    [User_Address] [varchar](150) NULL,
    [User_Gender] [varchar](10) NULL,
    [User_Joindate] [varchar](50) NULL,
    [User_Email] [varchar](50) NULL,
    [User_Branch] [varchar](50) NULL,
    [User_TeamLeader] [varchar](50) NULL,
    [User_Department] [varchar](50) NULL,
    [User_Position] [varchar](50) NULL,
    [TID] [int] NULL
  )

Break_Table

CREATE TABLE [dbo].[Break_TB]
  (
     [Break_Id] [int] IDENTITY(1,1) NOT NULL,
     [User_Id] [varchar](15) NOT NULL,
     [Date] [date] NULL,
     [Break_Time] [int] NULL,
     [Status] [varchar](50) NULL,
     [Late_time] [int] NULL,
     [TL_Id] [varchar](15) NULL,
     [start_Time] [time](7) NULL,
     [end_Time] [time](7) NULL,
 )

Log_Table

CREATE TABLE [dbo].[Log_TB]
 (
   [User_Id] [varchar](50) NOT NULL,
   [First_Login] [time](0) NULL,
   [Logout] [time](0) NULL,
   [Date] [date] NULL,
   [Working_Hrs] [time](0) NULL,
 )

现在我要做的是每当User_Table的User_Id被更新时,我想尝试更新另外两个表的User_Id,

我已经为那个

写了触发器
Alter TRIGGER [dbo].[updateUserId] on [dbo].[User_TB]
 FOR Update
 AS 
 declare @Branch_Name varchar(50),
 @User_Id varchar(15) 

 select @User_Id = i.User_Id from inserted i;

 Update Break_TB set User_Id = @User_Id where User_Id = @User_Id;
 Update Log_TB set User_Id = @User_Id where User_Id = @User_Id;

但是

它只更新Break_TB的记录,不适用于Log_TB

我不是很擅长触发,如果错了请帮助我。

1 个答案:

答案 0 :(得分:0)

你需要这样的东西 - 一个基于集合的解决方案,考虑到在UPDATE语句中你可能正在更新多行一次,因此您的触发器也必须处理InsertedDeleted表中的多行。

CREATE TRIGGER [dbo].[updateUserId] 
ON [dbo].[User_TB]
FOR UPDATE
AS 
    -- update the "Break" table - find the rows based on the *old* User_Id
    -- from the "Deleted" pseudo table, and set it to the *new* User_Id
    -- from the "Inserted" pseudo table
    SET User_Id = i.User_Id 
    FROM Inserted i
    INNER JOIN Deleted d ON i.TID = d.TID
    WHERE
        Break_TB.User_Id = d.User_Id

    -- update the "Log" table - find the rows based on the *old* User_Id
    -- from the "Deleted" pseudo table, and set it to the *new* User_Id
    -- from the "Inserted" pseudo table
    UPDATE Break_TB 
    SET User_Id = i.User_Id 
    FROM Inserted i
    INNER JOIN Deleted d ON i.TID = d.TID
    WHERE
        Break_TB.User_Id = d.User_Id

此代码假定 TID表中的User_TB列是主键,在更新期间保持不变(以便我可以将Deleted伪表中的" old"值与更新后的" new"值连接在一起,存储在Inserted伪表中