.NET BulkCopy Only Firing Trigger на одной вставке

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

var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers, transaction);

person Mike Flynn    schedule 07.11.2013    source источник
comment
Вероятно, вам придется отправить код в свой триггер, но я предполагаю, что он неправильно закодирован для работы с несколькими вставленными строками одновременно.   -  person CodeNaked    schedule 07.11.2013


Ответы (3)


«Для каждой вставки» или для каждой «строки»? Похоже, вы ожидаете увидеть срабатывание триггера для каждой строки.

Это распространенное заблуждение о триггерах - они срабатывают один раз для каждой строки. Они этого не делают. Они срабатывают один раз за смену. В теле триггера есть виртуальная таблица с названием «вставленная», которая содержит все новые вставленные строки. Это очень похоже на то, как триггер в вашей базе данных считывает только одну строку из этой таблицы, а не всю ее. К сожалению, это распространенный недостаток дизайна, которым многие люди реализуют триггеры в базах данных SQL Server.

person Dave Markle    schedule 07.11.2013
comment
Единственный способ обойти это - идти строка за строкой, что означает, что вы не можете массовое копирование - вам придется вставлять по одной строке за раз. А еще лучше исправить проблему в коде триггера - это огромная ошибка, и кто знает, что она делает с целостностью данных в вашей базе данных? - person Dave Markle; 07.11.2013

Я уже назначал всем элементам идентификатор группы. Я добился этого с помощью следующего:

1. If item has bulk group id
2. If item is being inserted, not updated
3. Do a select into from a selection of items based on the bulk group id

Курок

    IF(@BulkGroupInsertId IS NULL OR EXISTS (SELECT * FROM DELETED))
    BEGIN
        -- Do Single Insert
    END
    ELSE
    BEGIN

    -- Bulk Insert

        INSERT INTO TeamSubscription (DivisionTeamId, PhoneNumber, DateCreated)
        SELECT tc.TeamId, p.MobilePhone, GETDATE()
        FROM
            -- Commented Out
        WHERE 
            -- Commented Out
        GROUP BY
            -- Commented Out

    END 
person Mike Flynn    schedule 08.11.2013
comment
Если у вас действительно есть триггер, демонстрирующий такое поведение, я умоляю вас от имени всех, кто будет работать над вашим проектом после того, как вы исправите эту ошибку. - person Dave Markle; 08.11.2013
comment
Я не понимаю вашего комментария. - person Mike Flynn; 09.11.2013

Добавьте этот SQLBulkCopyOptions.FireTriggers при создании объекта SQLBulkCopy.

person Jaydeep Shil    schedule 15.09.2015