Запись нескольких строк данных из таблицы вставки с использованием триггера - PullRequest
0 голосов
/ 31 октября 2018

Я попытался создать триггер для хранения манипуляций с данными, сделанными на моей таблице Food, в другой таблице с именем FoodTriggerTable. Когда я вставляю только одну строку данных, я могу хорошо записать манипуляции с данными в FoodTriggerTable. Однако, когда я вставляю несколько строк одновременно, я сохраняю информацию только первой строки данных. У меня есть следующий триггер:

CREATE TRIGGER InsertFoodTrigger ON Food
AFTER INSERT
AS
    DECLARE @FoodID varchar(5);
    DECLARE @FoodName nvarchar(50);
    DECLARE @FoodDesc nvarchar(200);
    DECLARE @FoodPrice money;
    DECLARE @InsertAction varchar(200);
    DECLARE @InsertActionTime datetime;
    DECLARE @Amount int;

    SELECT @FoodID = i.FoodID FROM INSERTED i;
    SELECT @FoodName = i.FoodName FROM INSERTED i;
    SELECT @FoodDesc = i.FoodDesc FROM INSERTED i;
    SELECT @FoodPrice = i.FoodPrice FROM INSERTED i;
    SELECT @Amount = COUNT(*) FROM INSERTED i;

    SET @InsertAction = 'You''ve inserted ' +  CONVERT(varchar(10), @Amount) + ' data into ''Food'' table';

    INSERT INTO FoodTriggerTable (FoodID, FoodName, FoodDesc, FoodPrice, InsertAction, InsertActionTime)
    VALUES (@FoodID, @FoodName, @FoodDesc, @FoodPrice, @InsertAction, GETDATE());
GO

И я попробовал следующее INSERT:

INSERT INTO Food
VALUES  ('CH006', 'Dummy Data 1', 'Dummy data', '0', '34'),
        ('CH007', 'Dummy Data 2', 'Dummy data', '0', '75');

Как исправить мой триггер, чтобы он также записывал второй ряд манипуляций с данными?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018
CREATE TRIGGER InsertFoodTrigger ON Food
AFTER INSERT
AS
    INSERT INTO FoodTriggerTable (FoodID, FoodName, FoodDesc, FoodPrice, InsertAction, InsertActionTime)
    SELECT FoodID, FoodName, FoodDesc, FoodPrice, 'You''ve inserted ' +  CONVERT(varchar(10), (SELECT COUNT(*) FROM inserted)) + ' data into ''Food'' table', GETDATE()
    FROM inserted
GO
0 голосов
/ 31 октября 2018

Вам нужно думать, что набор основан - вставлена ​​таблица, в которой есть строка для каждой вставленной или обновленной записи. Просто используйте его как обычную таблицу - не пытайтесь преобразовать его в функциональное программирование, например

INSERT INTO FoodTriggerTable (FoodID, FoodName, FoodDesc, FoodPrice, InsertAction, InsertActionTime)
  select FoodId, FoodName, FoodDesc, FoodPrice, null, getdate()
  from Inserted

Примечание: не уверен, какое действие InsertAction вы хотите, когда его 1 в строке сейчас - до вас.

Edit: процедурный на самом деле правильный термин. При работе с T-SQL вы обычно манипулируете наборами данных, что и предназначено для него, учитывая язык программирования баз данных. Поэтому обычно вы пытаетесь сформулировать и решить проблему, которую пытаетесь решить с помощью наборов данных. Это вполне очевидно при написании триггера, потому что и вставка / обновление / удаление может включать любое количество записей, и вам придется справиться с этим. Конечно, вы можете использовать курсоры и циклы, чтобы вернуться к процедурному программированию, но производительность пострадает, и я думаю, что это просто не способ сделать это :) Есть много статей, вот пример https://www.sqlshack.com/introduction-set-based-vs-procedural-programming-approaches-t-sql/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...