我看到一些文章提到在视图上触发的可能性,即在对创建视图的基础表之一进行插入,更新或删除时触发。
但是我无法获得一个简单的示例来工作。
CREATE TABLE [Test].[Data] (
Id INT PRIMARY KEY IDENTITY (1,1),
Data VARCHAR(255) NOT NULL,
);
GO
CREATE VIEW [Test].[View] AS SELECT * FROM [Test].[Data];
GO
CREATE TABLE [Test].[Queue] (
Id INT PRIMARY KEY IDENTITY (1,1),
DataId INT NOT NULL,
Action VARCHAR(255) NOT NULL,
Timestamp DATETIME NOT NULL,
);
GO
CREATE TRIGGER InsertTrigger ON [Test].[View] INSTEAD OF INSERT AS
BEGIN
DECLARE @DataId INT;
DECLARE @Timestamp DATETIME;
SET @DataId = (SELECT Id FROM INSERTED);
SET @Timestamp = GETDATE();
INSERT INTO [Test].[Queue] (DataId, Action, Timestamp) VALUES (@DataId, 'Insert', @Timestamp)
END
GO
ENABLE TRIGGER InsertTrigger ON [Test].[View];
GO
INSERT INTO [Test].[Data] (Data) VALUES ('Testdata');
触发器没有触发,以上操作是不可能的,还是我的Sql有问题?
编辑:尽管回答了,但我想澄清这个问题。这个想法是在基表上有一个Insert而不是View本身时,触发View上的触发器。
答案 0 :(得分:2)
视图上的触发器仅适用于该视图中的插入,不适用于该视图所引用的表中的任何插入。
在脚本中,您没有插入该视图,而是在表中插入了
。答案 1 :(得分:1)
除了无法正确测试之外,您的观点还不正确。您不是在考虑inserted
代表多行,而不是一行。
所以:
CREATE TRIGGER InsertTrigger ON [Test].[View] INSTEAD OF INSERT AS
BEGIN
INSERT INTO [Test].[Queue] (DataId, Action, Timestamp)
SELECT i.Id, 'Insert', GETDATE()
FROM Inserted;
END;
GO
INSERT INTO [Test].[View] (Data)
VALUES ('Testdata');