2013-09-23 28 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