2016-11-14 54 views
0

我在SSIS中有一个包含多个任务的包。我正在加载文件,如果最后的文件系统任务失败,我希望能够回滚事务。我的包看起来就像那样。 general_package 我喜欢能够回滚SSIS脚本已完成的所有操作。为此,我需要SSIS脚本来登记由BEGIN_TRANSACTION Sql任务创建的事务。我该怎么做?SSIS脚本任务在当前事务中登记

在SSIS收集交易我做的:

object rawConnection = Dts.Connections["destination_ado"].AcquireConnection(Dts.Transaction); 
      myADONETConnection = (SqlConnection)rawConnection; 

然后我做了BulkCopy:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection)) 
        { 
         sbc.DestinationTableName = "[" + SCHEMA_DESTINATION + "].[" + TABLE_DESTINATION + "]"; 
         // sbc.DestinationTableName = "test_load"; 
         // Number of records to be processed in one go 
         sbc.BatchSize = 10000; 


         // Finally write to server 
         sbc.WriteToServer(destination); 
        } 
        myADONETConnection.Close(); 

我如何告诉使用SqlBulkCopy使用现有的交易? 在SSIS的连接选项,我使用RetainSameConnection:真

感谢您的想法

文森特

回答

0

在你的包看,我看你是通过一堆文件和每个迭代迭代,您将文件内容加载到目标表中。 您希望您的所有数据加载都是原子的,即完全加载或完全加载。

考虑到这一点,我想提出以下方法,并在所有这些appraoches的没有必要使用脚本任务或开始/结束事务块明确的 -

  1. 使用数据流任务和在属性中设置TransactionOption为Required。这将完成在块上启用交易的工作
  2. 在目的地将错误重定向以分批方式发送到错误表,以便将错误降至最低可能的最小值(例如 - http://agilebi.com/jwelch/2008/09/05/error-redirection-with-the-ole-db-destination/) 。我们在每天执行超过百万的数据加载时成功地使用了100k,50k,1作为3个批次。然后您可以单独处理这些错误。
  3. 如果用例使整个数据都失败,那么只需重定向失败的记录。使用文件系统任务(FST)将记录移动到'失败'文件夹。在FST之后有一个DFT在目标上执行查找,然后删除所有这些记录。
+0

嗨,感谢您的回答我不使用数据流的原因是该软件包用于不同的表结构不同,数据流不能有列的通用元数据 –

+0

您可以提供更多详细信息或示例你的意思是不同的表格有不同的结构?你想要解决什么样的用例? – VKarthik

0

所以我找到了一个解决方案。 在第一脚本块(提取物和负载)1创建一个事务与此代码:

SqlTransaction tran = myADONETConnection.BeginTransaction(IsolationLevel.ReadCommitted); 

然后我在SqlBulkCopy的这种方式使用该事务:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection,SqlBulkCopyOptions.Default,tran)) 

传递交易对象到SSIS变量:

Dts.Variables["User::transaction_object"].Value = tran; 

那么,在年底我的两个块上提交的事务和Rolloback交易我使用SSIS脚本,读取变量,要么提交或回滚事务:

SqlTransaction tran = (SqlTransaction)Dts.Variables["User::transaction_object"].Value; 
tran.Commit(); 

其结果是,如果一个文件不能被移动到存档文件夹我不明白负荷的两倍,交易很火的每个文件,所以如果一个文件不能只多关于这个文件的数据得到回滚,并且枚举器继续前进到下一个。