我有一个基于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语句不起作用,相反,触发器起作用,那么我们从哪里获得‘插入’魔术表中的值。
请解释一下。
发布于 2017-01-08 15:06:17
从相关的MSDN page
DML触发器语句使用两个特殊的表: deleted表和inserted表。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中的触发器必须始终写入,才能处理插入/删除的表中的多行。
https://stackoverflow.com/questions/41529081
复制相似问题