无法在SQL Server 2012上触发视图触发

时间:2019-06-16 14:35:05

标签: sql sql-server

我看到一些文章提到在视图上触发的可能性,即在对创建视图的基础表之一进行插入,更新或删除时触发。

但是我无法获得一个简单的示例来工作。

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上的触发器。

2 个答案:

答案 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');