sql-而不是触发器不会从视图中触发基表

时间:2011-06-23 17:45:17

标签: sql database view triggers insert

当新数据插入 BASETABLE 时,我希望它能够使View( RatherView )的触发器将数据插入到不同的表中。它仅在我手动向视图插入数据时有效,但在我将数据插入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(Color,   材料)          价值观(N'Red',N'Cloth')

     

- 查看INSERT语句的结果。    SELECT PrimaryKey,Color,   Material,ComputedCol来自另一个表

1 个答案:

答案 0 :(得分:3)

这是按设计工作的。用非数据库术语重述你的问题“我给前门把电气化了,但每当我走进后门时,我都不会感到震惊,只有当我走进前门时。”如果你打开后门时想要获得相同的震动,那么也要给那个电气化。

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