2011-06-23 124 views
0

当新的数据插入到BASETABLE我希望它使视图(InsteadView)的触发将数据插入到不同的表。它只适用于我手动将数据插入视图,但不是当我插入数据到基表。SQL的,而不是在basetable触发犯规触发从视图

CREATE TABLE BaseTable 
    (PrimaryKey  int PRIMARY KEY IDENTITY(1,1), 
    Color   nvarchar(10) NOT NULL, 
    Material  nvarchar(10) NOT NULL, 
    ComputedCol AS (Color + Material) 
) 
GO 

--Create a view that contains all columns from the base table. 
CREATE VIEW InsteadView 
AS SELECT PrimaryKey, Color, Material, ComputedCol 
FROM BaseTable 
GO 

--Create an INSTEAD OF INSERT trigger on the view. 
CREATE TRIGGER InsteadTrigger on InsteadView 
INSTEAD OF INSERT 
AS 
BEGIN 
    --Build an INSERT statement ignoring inserted.PrimaryKey and 
    --inserted.ComputedCol. 
    INSERT INTO anotherTable 
     SELECT Color, Material 
     FROM inserted 
END 
GO 

INSERT INTO BaseTable(颜色,材质 ) VALUES(N'Red 'N'Cloth')

- 查看INSERT语句的结果。 SELECT的PrimaryKey,颜色,材质 ,ComputedCol从另一个表

+0

视图的观点是什么? –

+0

这是一个简单的例子。真正的观点是由15个表组成的。如果我能使这个工作,它会帮助我解决真实的问题。 – tdjfdjdj

回答

3

这是事先设计好的。用非数据库术语来重述您的问题“我为前门把手充电,但每当我走进后门时,只有当我走进前门时,我才不会感到震惊。”如果你希望在打开后门的时候得到同样的震撼,那么也要给它通电。

触发器在视图上定义,因此当您向其中插入数据时,触发器会熄灭。没有任何东西在基础表上定义,如果没有触发器触发。在基表上放置一个而不是触发器会导致它将数据推送到备用表中,但是您永远不会获得数据(除非您执行一些血腥的黑客行为,例如添加另一列并根据值执行条件逻辑)。

+0

那么为什么会有人想要使用Intead的触发器?我不想手动将数据插入到我的视图中。我希望它在我的基础架构增长时能够增长,并且在每次插入时触发器都会写入另一个表。 – tdjfdjdj

+0

你的意思是你希望你的视图在基础架构增长时“增长”?视图只不过是一个“保存”的查询。如果您需要修改对象(表/视图),但不想担心重构调用代码,则触发器非常有用。调用者和数据库之间的契约仍然有效,但在封面之下,触发器将数据推入NewTable而不是旧数据库。至少,这是我必须使用它们的场景。我确信其他人有不同的用例。 – billinkc

+0

如果基本表有20行,我创建的视图也将有20行。所以我们可以说我有5个表,并且视图加入了他们的行。然后应用一些算法。现在我想让该视图中的新数据写入新表。你明白为什么这很重要,为什么我需要从每个插入的视图中获取数据? – tdjfdjdj