C# .NET BulkCopy仅在一次插入时触发触发器

C# .NET BulkCopy仅在一次插入时触发触发器,c#,.net,sql-server,triggers,sqlbulkcopy,C#,.net,Sql Server,Triggers,Sqlbulkcopy,我对表上的每个插入执行触发器。我正在使用bulkcopy向该表中进行批量插入。我读到FireTriggers会在表上触发我的触发器,但它只会触发一次,而不是每次插入。触发器从插入的项中获取一些数据,并将其插入到另一个表中。我只看到在另一个表中插入了一行,而不是超过一行。我是否错过了一个选择 var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers,

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

var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers, transaction);
“对于每个插入”,或对于每个“行”?听起来您希望看到每一行触发

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

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


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

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

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

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

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

您可能需要将代码发布到触发器,但我猜它的编码不适合同时插入多行。您可能必须将代码发布到触发器,但我猜它的编码不适合同时插入多行。解决此问题的唯一方法是逐行执行,这意味着您不能批量复制--您必须一次插入一行。更好的是,修复触发代码中的问题--这是一个巨大的错误,谁知道它对数据库的数据完整性有什么影响?解决这个问题的唯一方法是逐行执行,这意味着您不能批量复制--您必须一次插入一行。更好的是,修复触发器代码中的问题--这是一个巨大的错误,谁知道它会对数据库的数据完整性造成什么影响?如果你真的有一个触发器显示了这种行为,我代表在你修复此错误后将在你的项目上工作的所有人恳求你。我不理解你的评论。如果你真的有一个触发因素表现出这种行为,我代表在你修复此错误后将在你的项目上工作的所有人恳求你。我不理解你的评论。