【问题标题】:How to fire trigger after all records inserted?插入所有记录后如何触发触发器?
【发布时间】:2017-09-23 13:42:33
【问题描述】:

在 SQL Server 中,触发器何时被触发?

问题是,我有一个要插入 45,000 条记录的表。 我想将所有 45k 记录复制到其他表。 但我不希望触发器在每次插入时都运行,即 45000 次触发器。

我的触发器基本上是将记录从 TableA 复制到 TableB。

触发器:

Create trigger tri_1
on TableA
after insert
as 

Begin 

Insert into TableB (ID,Name,Others)
select ID,Name,Others from TableA
inner join inserted
on inserted.ID = TableA.ID

End

以上只是我的触发器的模板。

另外,我有一个问题,上面提到的触发器,它是如何工作的?喜欢为每一行触发还是在所有插入完成后触发?

【问题讨论】:

  • 不能只使用 SELECT * INTO new_table FROM old_table 吗?
  • 嗯,这让我有点困惑。我写了这个触发器,假设 45K 记录的批量插入意味着 45K 插入语句。我这样做是为了避免重复数据,因为我将使用 *(这意味着所有记录,新输入的和旧的)
  • @stefan 如果我使用您的查询,假设在我的表中插入了 40K 条记录,如果触发器在之后触发,假设插入 200 条记录,下次触发器触发时......它将再次复制旧的 200 条记录和新的 200 条记录...所以在这种情况下,我需要确保仅在插入所有 40K 后触发触发器
  • 如果我理解正确,您想将一个表(的内容)复制到一个新表中。为此,我不会使用触发器。我只需从旧表中选择我需要的所有内容,然后将结果集“粘贴”到新表中(原样)。我写了一个小例子(注意:只有一个 CREATE TABLE ...)dbfiddle.uk/…
  • 不,实际上我们是从SAP获取数据,所以当数据插入TableA时,我们需要将它复制到TableB中,这就是为什么需要触发器!

标签: sql sql-server


【解决方案1】:

在 SQL Server 中,当insert 语句完成时触发触发器。

在某些数据库中,对插入的每一行都执行触发器(在这些数据库中,for each row 通常是语法的一部分)。相比之下,SQL Server 会跟踪更改的行,这就是为什么它们存储在类似表的结构 inserteddeleted 中——假设它们只包含一行是错误的。

【讨论】:

  • 这意味着触发器将被触发 45000 次,对吧?导致一次插入 45000 条记录
  • @Sobmac 。 . .如果您有 45,000 次插入,则触发器将被调用 45,000 次。如果您有一个包含 45,000 行的插入,它将被调用一次。
  • 数据将从 SAP 接收到我们的表中,所以我实际上不知道 sql server 内部如何处理接收到的数据,45k 条记录将在 Bulk 中一次全部插入?还是执行 45k 单独插入?
  • @Sobmac 。 . .将数据放入临时表,使用insert . . select . . . from #temptable
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2021-03-08
  • 1970-01-01
  • 2015-11-11
  • 2016-01-27
相关资源
最近更新 更多