我在表格上的每个插页上执行触发器。我正在使用批量复制来对此表进行批量插入。我读过FireTriggers会在桌子上触发我的触发器,但它只进行一次,而不是每次插入。触发器从插入的项中获取一些数据,并将其插入另一个表中。我只看到在另一个表中插入了一行,而不是一行。我错过了一个选项吗?
var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers, transaction);
答案 0 :(得分:6)
“对于每个插页”,还是每个“行”?听起来你期望看到每一行的触发火。
这是一个关于触发器的常见误解 - 它们每行触发一次。他们没有。他们每次改变都会开火。在触发器的主体内部有一个名为“inserted”的虚拟表,其中包含插入的所有新行。听起来非常像数据库中的触发器只读取该表中的一行,而不是整个行。遗憾的是,这是很多人在SQL Server数据库中实现触发器的常见设计缺陷。
答案 1 :(得分: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
答案 2 :(得分:-1)
在创建SQLBulkCopy对象时添加此SQLBulkCopyOptions.FireTriggers。