2013-09-23 6 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) с log') – HABO

+0

Будет ли проблема, UPDATE', а не 'INSERT', на' register_count'? Если появляется новый «код», триггер будет эффективно игнорировать его. И 'count', который вы храните в' register_count', - это полные строки из 'register', не ограничиваясь определенным« кодом ». И 'вставленный' не очень полезный источник данных при выполнении оператора' DELETE'. Тем не менее, попробуйте традиционную технологию отладки удаления строк до тех пор, пока проблема не изменится. – HABO

+0

Другое предложение - имена _quote_, которые соответствуют встроенным ключевым словам, функциям, .... Следовательно, столбец '[count]' явно отличается от совокупности 'count()'. – HABO

ответ

0

Вы могли бы иметь случай чувствительную сверку и вам нужно изменить строку:

WHERE Register_Count.code = inserted.code 

к:

WHERE register_count.code = inserted.code 

В этом случае если вы обновляете register_count и вы в вашем предложении WHERE ссылается на «вставленный», который вы не указали в своем заявлении UPDATE.

Я думаю, что вы хотите что-то вроде этого:

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

Смежные вопросы