我有以下触发器:
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',那么'回滚事务'会在那种情况下删除行吗?
感谢!!!
答案 0 :(得分:13)
您的INSERT
语句始终在事务中运行 - 您已经明确定义了一个,如果没有,那么SQL Server将使用隐式事务。
您要在表格中插入一行(或多行)。然后 - 仍在事务内部 - AFTER INSERT
触发器运行并检查某些条件 - 通常使用触发器内可用的Inserted
伪表,其中包含已插入的行。
如果您在触发器中拨打ROLLBACK TRANSACTION
,那么是 - 您的交易,以及正在执行的所有操作,已回滚,就好像INSERT
从未发生过一样 - 数据库表中没有显示任何内容。
另外:FOR INSERT
与SQL Server中的AFTER INSERT
相同 - 在 INSERT
语句完成其工作后执行触发器。
要记住的一件事(很多程序员都错了):触发器每行一次 - NOT 每次触发一次!因此,如果您一次插入20行,触发器将被触发一次,并且触发器内的Inserted
伪表包含20行。你需要在编写触发器时考虑到这一点 - 你不总是处理只插入一行!
答案 1 :(得分:0)
不可能,因为当它们不存在行时,它将进入开始块...