SQL Server - 插入/插入后 - 回滚

时间:2012-11-14 04:40:50

标签: sql-server-2008

我有以下触发器:

  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',那么'回滚事务'会在那种情况下删除行吗?

感谢!!!

2 个答案:

答案 0 :(得分:13)

您的INSERT语句始终在事务中运行 - 您已经明确定义了一个,如果没有,那么SQL Server将使用隐式事务。

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

如果您在触发器中拨打ROLLBACK TRANSACTION,那么是 - 您的交易,以及正在执行的所有操作,已回滚,就好像INSERT从未发生过一样 - 数据库表中没有显示任何内容。

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

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

答案 1 :(得分:0)

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