所以我正在观看有关而不是触发器的youtube教程Instead of insert trigger Part 45(如果有人有兴趣)。
那个人试图将值插入到视图中,当然这是不可能的。因此,他创建了一个而不是触发器,并使用插入的表,将值插入视图所构成的表中,长篇故事。
我的观点是,当没有插入任何东西时,他是如何使用插入的表格的?
我的意思是你得到一个错误,而不是插入到视图中。插入的表是否包含仅在某处实际插入的数据?
答案 0 :(得分:4)
那个人试图在视图中插入值...这是 当然不可能。
事实并非如此。可以在满足t he rules for updatable views时插入视图,并且可以将值明确映射到单个表上的插入。
插入的表是否包含实际上只有的数据 插在某个地方?
对于AFTER INSERT
触发器,这基本上是正确的。 INSERTED
中的行
伪表反映了插入表中的那些。对于INSTEAD OF INSERT
触发器,将独立创建工作表以保存数据。
查看示例
CREATE VIEW dbo.Foo
AS
SELECT CAST('A' AS varchar(8000)) AS X
GO
CREATE TRIGGER TR
ON Foo
INSTEAD OF INSERT AS
SELECT COUNT(*)
FROM inserted
然后尝试
SET STATISTICS IO ON;
insert into dbo.Foo
SELECT TOP 1000 REPLICATE('A',8000)
FROM master..spt_values v1;
执行计划表明它会插入Foo
上面创建的Foo
上没有聚集索引。 inserted
表是tempdb
中的工作表。
统计IO结果显示
表'工作表'。扫描计数0,逻辑读取7619,物理读取0, 预读读取0,lob逻辑读取0,lob物理读取0,lob 预读读取0.表'spt_values'。扫描计数1,逻辑读取8, 物理读取0,预读读取0,lob逻辑读取0,lob 物理读取0,lob预读读取0。
(1行受影响)表'工作表'。扫描计数1,逻辑读取 1002,物理读取0,预读读取0,lob逻辑读取0,lob 物理读取0,lob预读读取0。
(1000行(s)受影响)
第一个引用是插入到它中,第二个引用是触发器本身中的SELECT