0

我对表上的每个插入执行触发器。我正在使用 bulkcopy 批量插入到该表中。我读过 FireTriggers 会在桌子上触发我的触发器,但它只会触发一次,而不是每次插入。触发器从插入的项目中获取一些数据,并将其插入到另一个表中。我只看到在另一张表中插入一行,而不是多于一行。我错过了一个选择吗?

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

3 回答 3

6

“对于每个插入”,还是对于每个“行”?听起来您希望看到每一行的触发器触发。

这是对触发器的常见误解——它们每行触发一次。他们没有。每次更改它们都会触发一次。在触发器的主体内有一个名为“inserted”的虚拟表,其中包含所有插入的新行。听起来很像您数据库中的触发器只是从该表中读取一行,而不是全部。遗憾的是,这是许多人在 SQL Server 数据库中实现触发器的常见设计缺陷。

于 2013-11-07T19:02:32.053 回答
0

我已经为所有项目分配了一个批量组 ID。我通过以下方式实现了这一点:

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 
于 2013-11-08T04:31:09.067 回答
-1

在创建 SQLBulkCopy 对象时添加此 SQLBulkCopyOptions.FireTriggers。

于 2015-09-15T13:27:43.940 回答