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微软:好的,谢谢你的澄清!