2012-03-16 8 views
0

Я изучаю триггер, и у меня возник вопрос.SQL Server 2008 FOR INSERT триггер не работает

Я создаю триггер, чтобы изменить комплекс времени.

В таблице данных weeklymeeting

|section_id| meeting type| days| timestart|timeend|class_id| 
| 13  | Lecture  | 5 | 01:00:00 |02:00:00|12  | 

timestart и timeend имеют тип данных TIME

я создаю триггер, который проверяет время сложный

, например

, если пользователь использует запрос, такой как

INSERT INTO DBO.WeeklyMeetings VALUES (35, 1,1 ,'11:40:00','11:42:00', 42) 

он должен вставить данные

однако

INSERT INTO CSE132B.DBO.WeeklyMeetings VALUES (35, 1, 1, '12:30:00','01:30:00', 42) 

, то он должен вернуть сообщение об ошибке, потому что это время комплекса

Поэтому я создал триггер для проверки времени комплексов .. но такие, как

ALTER TRIGGER [dbo].[check_section_time_complex] ON [dbo].[WeeklyMeetings] 
FOR INSERT AS 
IF EXISTS(select * from inserted as i INNER JOIN dbo.WeeklyMeetings as m ON (i.timestart BETWEEN m.timestart and m.timeend) 
OR(i.timeend BETWEEN m.timestart and m.timeend)) 
begin 
RAISERROR ('Can not update data because section time is complexing with other section!!', 16,1); 
rollback tran 
end 

ho wever, это действительно не работает ... я не уверен, что причина ...

Неужели кто-нибудь знает проблемы в этом триггере?

благодаря

ответ

1

Если на «это на самом деле не работает» вы имеете в виду, что это позволяет противоречивые данные, которые будут вставлены, а затем поднимая ошибку, это потому, что вы указали FOR INSERT триггер, который означает, что это происходит после данные вставляются.

Если вы хотите, чтобы предотвратить данные вставляются вам необходимо использовать INSTEAD OF триггер, который происходит до вставки и в том, что делать вставки себя, если это действительно.

См. http://msdn.microsoft.com/en-us/library/ms189799.aspx для определения триггера.

Если ошибка - это что-то еще, опишите ее более полно.

+0

Я изменил вместо, а затем сообщение об ошибке работает нормально. он должен вставить эти данные, если нет проблем, но теперь он не вставляет никаких данных ... –

+0

В триггере INSTEAD вы должны выполнить правильную вставку данных самостоятельно. Триггер INSTEAD OF * заменяет * любую попытку вставки, поэтому, если после проверок вы хотите вставить строку, вам нужно сделать это в триггере явно. Опасайтесь окончания в рекурсивном цикле вставок. – kaj

+0

Ваш другой (слегка уродливый) вариант должен придерживаться триггера FOR INSERT (AFTER), и если данные недействительны, удалите его, несмотря на то, что он только что был создан – kaj

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