我正在使用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'。
我犯的是什么错误?
答案 0 :(得分:2)
您正在视图上创建触发器,因此inserted
pseudotable将包含视图的列,并且emp
或id
都不存在。
您需要将视图更改为:
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)
您的观点没有您在触发器中使用的列。 更多:视图中只有两列,您在触发器中使用三列。