SQL而不是插入触发器混淆

时间:2017-01-28 20:06:48

标签: sql sql-server

所以我正在观看有关而不是触发器的youtube教程Instead of insert trigger Part 45(如果有人有兴趣)。

那个人试图将值插入到视图中,当然这是不可能的。因此,他创建了一个而不是触发器,并使用插入的表,将值插入视图所构成的表中,长篇故事。

我的观点是,当没有插入任何东西时,他是如何使用插入的表格的?

我的意思是你得到一个错误,而不是插入到视图中。插入的表是否包含仅在某处实际插入的数据?

1 个答案:

答案 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

上的聚簇索引

enter image description here

上面创建的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