【发布时间】:2015-05-16 09:29:01
【问题描述】:
我有 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,
)
日志表
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
我不太擅长触发器,如果错了请帮助我。
【问题讨论】:
-
您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器每个语句触发一次,因此如果您的
UPDATE语句影响25 行,您将触发触发器一次,然后Inserted和@987654327 @ 每个将包含 25 行。您的代码将在这 25 行中选择哪一行?select @User_Id = i.User_Id from inserted i;- 它是不确定的,你得到 一个,任意 行,而你忽略所有其他行。您需要重写触发器以考虑到这一点! -
你能告诉我如何解决它@marc_s
-
log_tb中user_id列的数据类型是什么?
-
另外,您的两个更新语句什么都不做 - 它们将值更新为已经存在的值。
-
对于 user_Id 在所有表中都是 Varchar@Bohemian
标签: sql sql-server-2008 triggers