我正在尝试创建一个每次更新时都会运行的触发器。
基本上:我有两个表:plans
包含主/标题行,plan_courses
包含详细信息。 plans
有id
个主密钥,plan_courses
有plan_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”。
我做错了什么?
答案 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)
答案 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';