为啥我的触发器在 SSIS 插入期间没有触发?

Posted

技术标签:

【中文标题】为啥我的触发器在 SSIS 插入期间没有触发?【英文标题】:Why aren't my triggers firing during an insert by SSIS?为什么我的触发器在 SSIS 插入期间没有触发? 【发布时间】:2012-06-06 08:05:25 【问题描述】:

我有一个带有 OLE DB 目标组件的 SSIS 数据流任务,该组件使用触发器将记录插入到表中。当我对该表执行正常的INSERT 语句时,触发器会触发。当我通过 SSIS 任务插入记录时,触发器不会触发。

如何在 SSIS 中触发触发器?

【问题讨论】:

【参考方案1】:

由于 OLE DB 目标任务使用批量插入,默认情况下不会触发触发器。来自BULK INSERT (MSDN):

如果未指定 FIRE_TRIGGERS,则不执行插入触发器。

必须通过其高级编辑器手动将 FIRE_TRIGGERS 指定为 OLE DB 组件的一部分。

然后将“FIRE_TRIGGERS”添加到FastLoadOptions的值(注意选项是逗号分隔的):

使用该选项,触发器应在任务执行期间触发。

【讨论】:

如果他们使用 ADO.Net 连接并以编程方式处理 SQL 数据库,是否有类似的选项? @NealR:是的,见SqlBulkCopy。 我只想补充一点,OLE DB Destination,如果你选中了Keep nulls,你的触发器也不会被触发。 @JIsaak 我检查了 Keep Nulls,它确实触发了我的触发器。我正在使用 SQL2008R2 和 SSIS 2012【参考方案2】:

补充 ladenedge 的回答。

因为 OLE DB 目标任务使用批量插入,所以触发器是 默认不触发

当您选择了“快速加载”选项时,这是正确的。

如果您将其更改为常规的“表或视图”数据访问模式,您的触发器应该会正常触发,因为插入是逐行完成的

【讨论】:

通常您使用批量加载,因为您的数十万行太慢而无法执行逐行操作,很多人会发现这不是最佳解决方案。【参考方案3】:

您可以在不使用 SQL Server Data Tool for Visual Studio 的情况下通过记事本(或任何其他文本编辑器)编辑 dtsx 文件来执行此操作。

搜索以下属性:

<property
 dataType="System.String"
 description="Specifies options to be used with fast load.  Applies only 
 if  fast load is turned on."
 name="FastLoadOptions">
      TABLOCK,CHECK_CONSTRAINTS
</property>

并添加值 FIRE_TRIGGERS,正如 Diego 已经描述的那样。

【讨论】:

以上是关于为啥我的触发器在 SSIS 插入期间没有触发?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的页面在刷新期间会在 Chrome 中触发“就绪”事件?

在 Oracle 插入触发器期间更新以前的记录版本

列值更改的 T-SQL (SQL Server 2016) 触发器,在插入

为啥 viewDidAppear 没有被触发?

为啥没有在我的 webView 中触发 observeValueForKeyPath?

为啥我的 Action 事件没有被触发?