Как использовать FIRE_TRIGGERS во вставке SQL оператора - PullRequest
1 голос
/ 17 ноября 2010

Я пытаюсь скопировать данные из таблицы "tb_A" в себя (с другим первичным ключом).

Когда в таблицу "tb_A" вставляется новая запись, я написал триггер для заполнения другой таблицы "tb_B"с одной записью.

Я выполнил следующую инструкцию.

INSERT INTO [tb_A]
       ([NAME])
 select top (20)[NAME] from [tb_A] 

Я ожидал 20 новых записей в" tb_B ".Но я не сделал.

В любом случае, я видел, что FIRE_TRIGGERS использует во время массовой вставки, чтобы преодолеть эту проблему.Есть ли способ использовать его в операторах вставки тоже?Пожалуйста, предоставьте мне пример.

Гаян


Триггерный код (скопирован из комментария Гаяна к ответу gbn):

CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT
AS
    DECLARE @AID as int
    SELECT @AID = [ID] FROM inserted

    INSERT INTO [tb_B]([IDA]) VALUES (@AID)

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Причина, по которой ваш триггер не работал должным образом, заключается в том, что он плохо спроектирован.Триггеры срабатывают один раз для каждой вставки, даже если вы вставляете миллион записей.У вас есть триггер, который предполагает, что он будет записывать одну запись за раз.Каждый раз, когда вы устанавливаете значение, вставленное или удаленное в скалярную переменную, триггер неверен и должен быть переписан.Попробуйте что-то вроде этого.

CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT 
AS 

    INSERT INTO [tb_B]([IDA])
    SELECT  [ID] FROM inserted 
1 голос
/ 17 ноября 2010

FIRE_TRIGGERS предназначен только для BULK INSERT (и bcp), но не для "стандартного" INSERT

Я ожидаю, что ваш триггер будет выглядеть примерно так:

CREATE TRIGGER TRG_tbA_I ON tb_A FOR INSERT
AS
SET NOCOUNT ON

INSERT tb_B (col1, col2, ...)
SELECT col1, col2, ... FROM INSERTED
GO

Вы используете специальную таблицу INSERTED, чтобы получить список новых строк в tb_A, а затем INSERT из этого в tb_B. Это работает для более чем одного ряда

Если вы добавите код триггера, мы можем объяснить, что пошло не так.

Редактировать: ваш триггер будет читать только одну строку (любую строку, без определенного порядка) из INSERTED. Это не основано на моем грубом примере.

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