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

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

如何在 SSIS 中触发触发器?

【问题讨论】:

    标签: sql triggers ssis bulkinsert


    【解决方案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 已经描述的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多