SQL Server中的IF语句触发条件

时间:2015-09-15 01:17:16

标签: database sql-server-2008 triggers

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

student表中的教师ID是外键,因此我可以在学生表中重复 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'
End  

1 个答案:

答案 0 :(得分:0)

您的根本缺陷是,您似乎希望触发器每行一次 - 这在SQL Server中是 NOT 。相反,触发器会在每个语句时触发,而伪表un可能包含多行

鉴于该表可能包含多行 - 您希望在这里选择哪一行?

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 WILL 包含多行的知识重写整个触发器!您需要使用基于集合的操作 - 不要只期望Inserted中的一行!

此外:触发器触发 AFTER 插件已经发生,所以你的代码在这里:

Inserted

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

所以你需要

  • 重写您的触发器,以正确处理If @count < 6 Insert into student(s_id, s_name, birthday, t_id) values(@s_id, @s_name, @birthdate, @count)
  • 中的多行
  • 切换到Inserted触发器,或更改触发逻辑