【问题标题】:.NET BulkCopy Only Firing Trigger On One Insert.NET BulkCopy 仅在一次插入时触发触发器
【发布时间】:2013-11-07 18:59:24
【问题描述】:

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

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

【问题讨论】:

  • 您可能必须将代码发布到您的触发器,但我猜它的编码不正确,无法同时插入多行。

标签: c# .net sql-server triggers sqlbulkcopy


【解决方案1】:

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

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

【讨论】:

  • 解决此问题的唯一方法是逐行进行,这意味着您不能批量复制——您必须一次插入一行。更好的是,修复触发器代码中的问题 - 这是一个巨大的错误,谁知道它对数据库的数据完整性有什么影响?
【解决方案2】:

我已经为所有项目分配了一个批量组 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 

【讨论】:

  • 如果您确实有一个表现出这种行为的触发器,我代表在您修复此错误后将在您的项目上工作的每个人恳求您。
  • 我不明白你的评论。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多