11

我有以下触发器:

  CREATE Trigger instructor_expertise on CourseSections
     After Insert
     As Begin
     ......

     If (Not Exists(Select AreaName From AreasOfInstructor Where (InstructorNo = @InstructorNo AND AreaName = @AreaName))) 
     Begin 
     RAISERROR('Course not in instructors expertise', 16, 1)
     rollback transaction  
     End
     GO

我的问题是,“回滚事务”会删除该行吗?如果它是“For Insert”,那么“回滚事务”会在这种情况下删除该行吗?

谢谢!!!

4

2 回答 2

19

你的INSERT语句总是在一个事务中运行——要么你明确定义了一个,要么如果没有,那么 SQL Server 将使用一个隐式事务。

您要在表中插入一行(或多行)。然后 - 仍在事务内部 -AFTER INSERT触发器运行并检查某些条件 - 通常使用Inserted触发器内部可用的伪表,其中包含已插入的行。

如果你调用ROLLBACK TRANSACTION你的触发器,那么是的——你的事务,以及它一直在做的所有事情,都会被回滚,就好像这INSERT从未发生过一样——你的数据库表中什么都没有出现。

此外:与 SQL ServerFOR INSERT中的相同AFTER INSERT- 触发器在语句完成其工作后执行。INSERT

要记住的一件事(很多程序员都错了):每个语句触发一次触发器-而不是每行一次!因此,如果您一次插入 20 行,触发器会被触发一次,并且触发器内的Inserted伪表包含 20 行。您在编写触发器时需要考虑到这一点 - 您并不总是只处理插入的一行!

于 2012-11-14T06:25:00.037 回答
0

不,这是不可能的,因为当它们不存在时,它将进入开始块......

于 2012-11-14T05:51:09.620 回答