SQL Server 2008 FOR INSERT触发器无法正常工作

时间:2012-03-16 11:54:49

标签: sql sql-server sql-server-2008 triggers

我正在研究触发器,我有一个问题。

我正在创建一个触发器来改变复杂的时间。

在数据表weeklymeeting

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

timestarttimeend的数据类型为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
然而,它并没有真正起作用......我不确定这个理由......

有没有人知道这个触发器有问题?

感谢

1 个答案:

答案 0 :(得分:1)

如果“它没有真正起作用”,你的意思是它允许插入冲突的数据然后引发错误,这是因为你已经指定了FOR INSERT触发器,这意味着它发生在之后插入数据。

如果您想阻止插入数据,您需要使用{<1}}触发器,该触发器在插入之前发生,并且在其中,如果它有效,请自行插入。

有关触发器定义,请参阅http://msdn.microsoft.com/en-us/library/ms189799.aspx

如果错误是其他错误,请更全面地描述。