Триггер при просмотре не запускается на SQL Server 2012 - PullRequest
1 голос
/ 16 июня 2019

Я видел, что в некоторых статьях упоминается возможность триггера в представлении, запускающего при вставке, обновлении или удалении в одну из базовых таблиц, из которой создается представление.

Однако я не могучтобы получить простой пример для работы.

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?

Редактировать: Хотя ответили, я бы хотелуточнить вопрос.Идея состояла в том, чтобы вызвать срабатывание триггера в представлении, когда была вставка в базовую таблицу, а не само представление.

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Триггер в представлении будет работать только для вставок в это представление, а не для любых вставок в таблицы, на которые ссылается представление.

В вашем скрипте вы не вставляете в это представление, вы вставляете в таблицу.

1 голос
/ 16 июня 2019

В дополнение к неправильной проверке, ваше мнение неверно.Вы не учитываете, что 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...