无法创建[After UPDATE]触发器

时间:2018-02-18 07:23:50

标签: sql sql-server

我正在尝试创建一个每次更新时都会运行的触发器。

基本上:我有两个表:plans包含主/标题行,plan_courses包含详细信息。 plansid个主密钥,plan_coursesplan_id个外键。

一旦课程为attended,我应该计算计划中的所有课程,并检查所参加的计数是否等于给定计划中的课程总数。如果是这样,那么整个标题/主行应标记为done。否则,它应标记为not done

以下是我的尝试:

create trigger my_trigger on plan_courses 
after update 
as
begin

  declare @attended_cnt int;
  declare @total_cnt int;
  declare @plan_status varchar;

  select @total_cnt = count(*) from plan_courses where plan_id=inserted.plan_id;

  select @attended_cnt=count(*) from plan_courses 
         where plan_id=inserted.plan_id and course_status='attended';

  select @plan_status = case when @attended_cnt < @total_cnt then 'not done' else 'done' end;


  update plans set plan_status = @plan_status where id=inserted.plan_id;


end;

当我执行此操作时,我得到:

  

SQL Server数据库错误:无法绑定多部分标识符“inserted.plan_id”。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

Here您可以找到有关触发器错误的一些提示。

INSERTED是对UPDATED行的引用,但是以表格的形式(如果你想这样称呼它)。

您应该如何修复查询,并使用INSERTED加入您的表格以获得结果:

create trigger my_trigger on plan_courses 
after update 
as
begin

  declare @attended_cnt int;
  declare @total_cnt int;
  declare @plan_status varchar;

  select @total_cnt = count(*) 
  from plan_courses as p
  inner join inserted as j
    on p.plan_id=j.plan_id;

  select @attended_cnt=count(*) 
  from plan_courses as p
  inner join inserted as j
    on p.plan_id = j.plan_id and p.course_status = 'attended';

  select @plan_status = case when @attended_cnt < @total_cnt then 'not done' else 'done' end;


  update plans 
  set plan_status = @plan_status 
  from plans as p
  inner join inserted as i
    on i.plan_id = p.id;


end;

答案 1 :(得分:0)

INSERTED是一个临时表。

select @total_cnt = count(*) from INSERTED

msdn

答案 2 :(得分:0)

你应该加入表并使用inserted表,而不是下面的

plan_id=inserted.plan_id

你应该这样做

 select @attended_cnt=count(*) from plan_courses p
                      join
                      inserted i on p.plan_id=i.plan_id and course_status='attended';