SQL Server触发器中的IF语句,带条件

0 人关注

我创建了一个表 student ,我想创建一个触发器来停止向任何学生添加6岁以上的教师ID。 教师ID在6岁以后的学生,所以每5个学生只有一个教师。

student 表中的教师ID是一个外键,所以我可以在学生表中重复5次。 5次,当我插入6次时......不同意,我试着用这个代码,但它不起作用。

student 表看起来像这样。

CREATE TABLE student
    s_id int PRIMARY key,
    s_name varchar(50) ,
    birthday date ,
    t_id int 

和触发器。

CREATE TRIGGER tr_student 
on student
DECLARE
    @count int,
    @s_id int,
    @s_name nvarchar(50),
    @birthdate date,
    @t_id int
Begin
    select @s_id = i.s_id from inserted i;
    select @s_name = i.s_name from inserted i;
    select @birthdate = i.birthday  from inserted i;
    select @t_id = i.t_id from inserted i;
    Select count(*) t_id
    From student
    Where @count = t_id
    If @count < 6 
       Insert into student(s_id, s_name, birthday, t_id)
       values(@s_id, @s_name, @birthdate, @count)
    PRINT 'AFTER INSERT trigger fired'
    
2 个评论
触发器将对整个INSERT操作触发一次,而不是逐个ROW。
所以呢?....,我尝试了这个代码,但不工作。
database
sql-server-2008
triggers
Ibrahim Mahmoud Emara
Ibrahim Mahmoud Emara
发布于 2015-09-15
1 个回答
marc_s
marc_s
发布于 2015-09-15
0 人赞同

你的基本缺陷是,你似乎希望触发器 每行 被触发 一次 --在SQL Server中 不是 这样的。相反,触发器 每条语句触发一次 ,而伪表 Inserted 可能包含 多条记录

鉴于该表可能包含多条记录,你希望在这里选择哪一条?

select @s_id = i.s_id from inserted i;
select @s_name = i.s_name from inserted i;
select @birthdate = i.birthday  from inserted i;
select @t_id = i.t_id from inserted i;    

这是没有定义的--你将从Inserted 中的任意行中获得数值,而你将忽略所有其他的行。

你需要重写你的整个触发器,因为你知道Inserted 包含多条记录你需要使用基于集合的操作--不要指望在Inserted 中只有一条记录!

此外:触发器是插入发生后才触发的,所以你的代码在这里。

If @count < 6 
   Insert into student(s_id, s_name, birthday, t_id)
   values(@s_id, @s_name, @birthdate, @count)

基本上是再次插入相同的数据--当然不是你想要的。

所以你需要