Я изучаю триггер, и у меня возник вопрос.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, это действительно не работает ... я не уверен, что причина ...
Неужели кто-нибудь знает проблемы в этом триггере?
благодаря
Я изменил вместо, а затем сообщение об ошибке работает нормально. он должен вставить эти данные, если нет проблем, но теперь он не вставляет никаких данных ... –
В триггере INSTEAD вы должны выполнить правильную вставку данных самостоятельно. Триггер INSTEAD OF * заменяет * любую попытку вставки, поэтому, если после проверок вы хотите вставить строку, вам нужно сделать это в триггере явно. Опасайтесь окончания в рекурсивном цикле вставок. – kaj
Ваш другой (слегка уродливый) вариант должен придерживаться триггера FOR INSERT (AFTER), и если данные недействительны, удалите его, несмотря на то, что он только что был создан – kaj