【问题标题】:SQL Server 2008 FOR INSERT trigger not workingSQL Server 2008 FOR INSERT 触发器不起作用
【发布时间】:2012-03-16 11:54:49
【问题描述】:

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

我正在创建一个触发器来更改时间复合体。

数据表中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

但是,它并没有真正起作用...我不太确定这个原因....

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    如果“它没有真正工作”是指它允许插入冲突数据然后引发错误,这是因为您指定了 FOR INSERT 触发器,这意味着它发生在 之后 em> 数据被插入。

    如果你想阻止数据被插入,你需要使用一个INSTEAD OF 触发器,该触发器发生在插入之前,如果它是有效的,你自己在里面插入。

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

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

    【讨论】:

    • 我改为代替,然后错误消息工作正常。如果没有问题,它必须插入这些数据,但它现在没有插入任何数据......
    • 在 INSTEAD OF 触发器中,您必须自己进行有效的数据插入。 INSTEAD OF 触发器替换 任何尝试的插入,因此如果在检查后要插入行,则需要在触发器中显式执行此操作。当心以递归循环结束。
    • 您的另一个(有点难看)选项是坚持使用 FOR INSERT (AFTER) 触发器,如果​​数据无效,尽管它刚刚创建,但仍将其删除
    • 哈哈。我只是用 else case 向表中插入数据!!谢谢!!!我想,我对“代替”和“为”的概念有误解,哈哈
    • @DcRedwing - 如果您要将其编写为触发器,请确保编写它以应对边缘情况 - 例如如果单个INSERT 语句实际上尝试插入两个相互重叠的行。
    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多