2013-09-23 27 views
0

我很难创建触发器来更新有多少学生注册的计数。以下是我的表格的设置。这第一块代码是由我的老师提供的。无论何时注册或删除学生,register_count表都需要根据注册人数的适当数量进行更新。跨表格的SQL触发器

Create table Registered 
(
    ssn numeric, 
    code char(10), 
    year int, 
    semester char(10), 
foreign key (ssn) references Student(ssn), 
foreign key (code) references Course(code), 
    primary key (ssn,code,year,semester) 
); 

create table Register_Count 
(
    code char(10), 
    year int, 
    semester char(10), 
    count int default 0, 
    primary key (code, year, semester) 
); 

这是我迄今为止触发器的尝试。我不断收到'多部分标识符不能被绑定的错误'。

CREATE TRIGGER updateCount ON registered 
    AFTER UPDATE, DELETE, INSERT 
    AS 
    UPDATE register_count SET 
     code = (select code from inserted), 
     year = (select year from inserted), 
     semester = (select semester from inserted), 
     count = (select count(*) from registered) 
    WHERE Register_Count.code = inserted.code 
GO 
+0

'inserted'和'deleted'是表,以便他们可以代表组操作的结果。假设它们总是包含一行,设计一个触发器通常是一个糟糕的计划。如果你完全确定永远不会有多行,那么请添加一个行数检查并使用'RaIsError'来明确告知那些稍后来到的人他们试图执行不可接受的语句。 ('if(从插入中选择Count(*))> 1 RaIsError('FooTable_Insert:不会超过一行可以被处理',25,42)with log') – HABO

+0

这是一个问题,你只能做一个' 'UPDATE',从来没有'INSERT',在'register_count'上?如果出现新的“代码”,触发器将会有效地忽略它。你在'register_count'中存储的'count'是'registered'的总行数,不限于特定的'code'。当执行'DELETE'语句时'inserted'不是一个非常有用的数据源。也就是说,尝试使用传统的调试技术来清除线路,直到问题发生变化。 – HABO

+0

另一个建议是_quote_名称碰巧匹配内置关键字,函数......。因此''count]'列可以清楚地区分'count()'集合。 – HABO

回答

0

你可以有一个区分大小写的排序规则和您需要更改行:

WHERE Register_Count.code = inserted.code 

到:

WHERE register_count.code = inserted.code 

在这种情况下,虽然要更新register_count你在你的WHERE子句中有一个对你在UPDATE语句中没有引用的'inserted'的引用。

我想你想是这样的:

UPDATE register_count 
from register_count inner join inserted 
on Register_Count.code = inserted.code 
SET 
code = inserted.code, 
year = inserted.year, 
semester = inserted.semester, 
count = (select count(*) from registered) 
+0

这并不适合我。我不需要有两个相同的名字吗? – waltershc

+0

也许看看'count'列的名字 - 它是一个保留的名字,所以这可能会导致问题 - 包装它像这样[count] –

+0

我刚刚尝试过,它仍然无法正常工作。我是否正确引用插入的表格? – waltershc