SSIS通过服务器循环并处理失败的登录

时间:2013-03-08 19:59:33

标签: sql-server-2008 error-handling ssis foreach-loop-container

创建一个将循环遍历不同环境(DEV,UAT,PROD)中所有服务器的包。我们使用服务帐户,DEV和UAT有一个服务帐户,PROD有另一个服务帐户。我正在使用ForEach循环容器/变量来设置连接字符串。

问题:当循环中的数据流试图连接到PROD服务器时,它们会失败,因为它们正在使用显然无法访问PROD的DEV / UAT服务帐户,这很好。问题是这会导致循环失败。通常我只是在数据流上放置一个事件处理程序并设置事件处理程序的系统变量传播:OnError = False,这样错误就不会冒泡到循环并杀死它。好吧,这不起作用,因为数据流中的OLE DB连接在验证期间失败(当程序包正在运行时)并且显然Propagate = False设置只会在执行任务期间发生错误而不会冒泡而不是任务的验证。

我可以在包括包本身在内的所有内容上设置MaximumErrorCount = 0,但这有点重,并且无论遇到什么错误,包都会报告它成功运行。

运行SQL Server 2008-R2

Link一篇关于如果有人不熟悉它,如何不使用传播设置杀死你的循环的文章。

1 个答案:

答案 0 :(得分:2)

一个建议是在数据流任务之前放置一个脚本任务,该任务使用try-catch块检查对连接字符串的访问,并在失败时设置变量,然后在条件分割中使用该变量来确定是否为运行数据流或记录连接字符串失败。

或者,如果您不关心它失败的原因(因为您已经知道它是因为权限),您可以使用优先约束并仅运行连接成功的数据流。

更新:

以下是脚本任务的一些工作代码:

 public void Main()         {

string connString = Dts.Variables["ConnectionStringToTest"].Value;

                try                {
                    using (OleDbConnection connection = new OleDbConnection()) {
                        connection.ConnectionString = connString;
                        connection.Open();
                    }
                    Dts.Variables["User::DatabaseCanConnect"].Value = true;                
                }
                catch (Exception ex) {
                    Dts.Variables["User::DatabaseCanConnect"].Value = false;
                }

                Dts.TaskResult = (int)ScriptResults.Success;
            }
  1. 在包范围内创建名为 DatabaseCanConnect 的变量。将其设置为布尔值,它将默认为False。
  2. 创建脚本任务。编辑 ReadWriteVariables 属性并添加新变量。
  3. 添加到 ReadOnlyVariables 用于构建ForEach循环之外的连接字符串的任何变量。我将我的名字命名为 ConnectionStringToTest
  4. 将上面的脚本代码添加为Main()函数。请注意,这使用 OleDbConnection 。这应该模仿您在数据流中修改的连接管理器所使用的任何连接。因此,如果它是SQL连接,请使用 SqlConnection
  5. 在您的代码中,使用DatabaseCanConnect变量来确定此处的流量。您可以在优先约束中使用它来阻止流向数据流,或者在条件分割中使用它(我的偏好,对其他开发人员更为明显),以便在失败时记录连接错误,否则正常进行。