Триггер SQL Server вставляет целые строки таблицы вместо новых

Я где-то ошибаюсь, но не могу понять.

Сценарий таков: всякий раз, когда в таблицу TestTrigger вставляется новая строка, таблица TriggerInsert должна получить время захвата значения, когда новая строка была вставлена ​​в TestTrigger.

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

Вот мой триггер:

USE [irfaan]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Trigger [dbo].[InsertTriggerTest] on [irfaan].[dbo].[TestTrigger]
--For Insert
After insert
as
INSERT into TriggerInsert (CurrTime, IOFNum) SELECT (GetDate()), SONum   FROM TestTrigger

Пожалуйста, помогите, где я ошибаюсь.


person Irfaan Wahid    schedule 06.05.2017    source источник
comment
какую систему баз данных вы используете? Синтаксис между ними различается, и невозможно сказать, правильный у вас синтаксис или нет.   -  person DigiFriend    schedule 06.05.2017
comment
Использование SQL Server 2012   -  person Irfaan Wahid    schedule 06.05.2017


Ответы (2)


Если вы хотите просмотреть только вставленные строки, вы должны использовать псевдотаблицу Inserted, а не базовую таблицу dbo.TestTrigger....

ALTER TRIGGER dbo.InsertTriggerTest
ON irfaan.dbo.TestTrigger
FOR INSERT
AS 
   INSERT INTO TriggerInsert (CurrTime, IOFNum) 
       SELECT GETDATE(), SONum   
       FROM Inserted
person marc_s    schedule 06.05.2017
comment
Большое спасибо, это работает. Хотя мне до сих пор непонятно, что делает таблица Inserted? - person Irfaan Wahid; 06.05.2017
comment
@IrfaanWahid: псевдотаблица Inserted содержит те строки, которые были вставлены оператором, вызвавшим срабатывание этого триггера. Подробнее об этом в Документах Microsoft - person marc_s; 06.05.2017
comment
Спасибо, понял. - person Irfaan Wahid; 08.05.2017

Ваш запрос SELECT возвращает все строки из исходной таблицы (TestTrigger). Вместо этого используйте таблицу inserted. Он будет содержать только строки, которые вставляются в TestTrigger, а не все строки, которые вы получаете в настоящее время.

INSERT into TriggerInsert (CurrTime, IOFNum) SELECT (GetDate()), SONum   FROM Inserted
person Anthony K    schedule 06.05.2017