INSTEAD OF INSERT触发SQL Server中的视图

时间:2015-04-04 12:01:10

标签: sql-server

我正在使用SQL Server 2012:

查询是:

create table t11 (pid int not null, emp varchar(10))
create table t12 (id bigint, fn varchar(100))

create view tesr
as
   select 
       a.pid, b.fn 
   from 
       t11 a 
   join 
       t12 b on a.pid = b.id

create trigger tesr_trig on dbo.tesr
instead of insert
as 
begin
    insert into t11  
       select i.pid, i.emp 
       from inserted i

    insert into t12  
       select i.id, i.fn 
       from inserted i
end

执行时出现以下错误:

  

Msg 207,Level 16,State 1,Procedure tesr_trig,Line 5   列名称无效' emp'。
  Msg 207,Level 16,State 1,Procedure tesr_trig,Line 6
  列名称无效' id'。

我犯的是什么错误?

2 个答案:

答案 0 :(得分:2)

您正在视图上创建触发器,因此inserted pseudotable将包含视图的列,并且empid都不存在。

您需要将视图更改为:

alter view tesr
as
    select a.pid, b.fn, a.emp from t11 a join t12 b on a.pid=b.id

并且您的触发器需要在a.pid and b.id之间的视图中加入联接,因此需要将视图的pid值插入到两个表中。

ALTER trigger tesr_trig on dbo.tesr
instead of insert
as 
begin
  SET NOCOUNT ON;
  insert into t11(pid, emp)
    select i.pid,i.emp from inserted i
  insert into t12(id, fn)
    select i.pid,i.fn from inserted i
end

然后视图插入:

INSERT INTO tesr(pid, fn, emp) VALUES (1, 'fn', 'emp')

将插入到视图的两个基础表中。

答案 1 :(得分:1)

您的观点没有您在触发器中使用的列。 更多:视图中只有两列,您在触发器中使用三列。