为啥我的触发器在 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 中触发“就绪”事件?
列值更改的 T-SQL (SQL Server 2016) 触发器,在插入