插入表角色而不是插入触发器

时间:2017-01-08 03:09:15

标签: sql-server triggers

我有一个基于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'魔术表中的值。

请解释。

1 个答案:

答案 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中的触发器必须始终才能处理插入/删除表中的多行。