我有以下触发器:
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’,那么’回滚事务’会删除该行中的行吗?
谢谢!!!
解决方法
您的INSERT语句始终在事务中运行 – 您已经明确定义了一个,如果没有,那么sql Server将使用隐式事务.
您正在向表中插入一行(或多行).然后 – 仍在事务内部 – AFTER INSERT触发器运行并检查某些条件 – 通常使用触发器内可用的Inserted伪表,其中包含已插入的行.
如果你在你的触发器中调用ROLLBACK TRANSACTION,那么是 – 你的事务,它正在做的所有事情都被回滚,就好像INSERT从未发生过 – 没有任何东西出现在你的数据库表中.
另外:FOR INSERT与sql Server中的AFTER INSERT相同 – 触发器在INSERT语句完成其工作后执行.
要记住一件事(很多程序员都会出错):每批触发一次触发器 – 每行不会触发一次!因此,如果一次插入20行,则触发器将触发一次,触发器内的Inserted伪表包含20行.在编写触发器时,您需要考虑到这一点 – 您并不总是处理插入的单行!