Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server-插入后/用于插入-回滚_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL Server-插入后/用于插入-回滚

Sql server 2008 SQL Server-插入后/用于插入-回滚,sql-server-2008,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

我有以下触发条件:

  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”,那么“rollback transaction”是否会删除该行


谢谢

不,这是不可能的,因为当它们的行不存在时,它将进入begin块…

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

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

如果在触发器中调用
ROLLBACK TRANSACTION
,则是-您的事务及其所做的一切都是回滚的,就好像
INSERT
从未发生过一样-数据库表中没有显示任何内容

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


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

谢谢你的回复!那么我应该如何防止添加行?@MitchWheat:事务将始终存在-否?无论是显性的还是隐性的。回滚将终止该事务并撤消该事务试图对表执行的任何操作。是的,对不起,Marc,这是正确的。我的意思是明确的交易。我想我可能把水弄脏了。。。我将删除以前的评论。您从哪里获得这些值
@InstructorNo
@AreaName
??基本上,如果您在触发器中调用
回滚事务
,您将停止并中止
插入
,并且不会插入任何行。非常感谢您!!!我省略了那些代码。这两个都来自“inserted”@DavidBrowne微软:好的,谢谢你的澄清!