首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >instead of insert触发器中插入的表角色

instead of insert触发器中插入的表角色
EN

Stack Overflow用户
提问于 2017-01-08 11:09:15
回答 1查看 330关注 0票数 0

我有一个基于2个表的视图,我已经编写了一个instead of insert触发器来插入到该视图中:

代码语言:javascript
复制
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语句不起作用,相反,触发器起作用,那么我们从哪里获得‘插入’魔术表中的值。

请解释一下。

EN

回答 1

Stack Overflow用户

发布于 2017-01-08 15:06:17

从相关的MSDN page

DML触发器语句使用两个特殊的表: deleted表和inserted表。SQL Server会自动创建和管理这些表。您可以使用这些驻留在内存中的临时表来测试某些数据修改的效果,并为DML触发器操作设置条件。不能直接修改表中的数据或对表执行数据定义语言(DDL)操作,如CREATE INDEX。

视图上的插入被instead of触发器的使用阻塞了--这就是“代替”的字面意思。

请注意,如果视图的insert语句尝试插入多条记录,则触发器代码将失败。这是因为在SQL Server中,触发器是按语句而不是按行引发的。触发器开头指定的以下代码

代码语言:javascript
复制
Declare @DeptId int
Select @DeptId = DeptId 
from tblDepartment 
join inserted
on inserted.DeptName = tblDepartment.DeptName

一旦插入的表中有多行与on子句匹配,则将失败。

SQL Server中的触发器必须始终写入,才能处理插入/删除的表中的多行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41529081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档