我有一个基于2个表的视图,我写了一个instead of insert
触发器插入到该视图中:
Create trigger tr_vWEmployeeDetails_InsteadOfInsert
on vWEmployeeDetails
Instead Of Insert
as
Begin
Declare @DeptId int
Select @DeptId = DeptId
from tblDepartment
join inserted on inserted.DeptName = tblDepartment.DeptName
if(@DeptId is null)
Begin
Raiserror('Invalid Department Name. Statement terminated', 16, 1)
return
End
Insert into tblEmployee(Id, Name, Gender, DepartmentId)
Select Id, Name, Gender, @DeptId
from inserted
End
上面的代码工作正常,但我想知道视图的insert语句不起作用,而是触发器工作,然后我们从哪里获取'inserted'魔术表中的值。
请解释。
答案 0 :(得分:0)
来自相关的MSDN page:
DML触发器语句使用两个特殊的表:已删除的表和插入的表。 SQL Server自动创建和管理这些表。您可以使用这些临时的内存驻留表来测试某些数据修改的效果,并为DML触发器操作设置条件。您不能直接修改表中的数据或对表执行数据定义语言(DDL)操作,例如CREATE INDEX。
使用instead of
触发器阻止视图上的插入 - 这实际上是“而不是”的含义。
请注意如果对视图的insert语句将尝试插入多个记录,则触发器代码将失败。原因是在SQL Server中,每个语句引发触发器,而不是每行引发触发器。以下代码在触发器的开头
中指定Declare @DeptId int
Select @DeptId = DeptId
from tblDepartment
join inserted
on inserted.DeptName = tblDepartment.DeptName
一旦插入的表将有多个与on子句相匹配的行(如果是连接),则会失败。
SQL Server中的触发器必须始终才能处理插入/删除表中的多行。