1

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

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

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

运行 SQL Server 2008-R2

链接到一篇文章,如果有人不熟悉它,如何使用传播设置不终止循环。

4

1 回答 1

2

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

或者,如果您不关心它失败的原因(因为您已经知道这是因为权限),您可以只使用 Precedence Constraint 并且只在连接成功的地方运行数据流。

更新:

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

 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. 将您用于在 ForEach 循环之外构建连接字符串的任何变量添加到您的ReadOnlyVariables 。我已经命名了我的ConnectionStringToTest
  4. 将上面的脚本代码添加为您的 Main() 函数。请注意,这使用OleDbConnection。这应该模仿您在数据流中修改的连接管理器使用的任何连接。因此,如果它是 SQL 连接,请改用SqlConnection
  5. 在您的代码中,使用 DatabaseCanConnect 变量来确定此处的流量。您可以在优先约束中使用它来防止流向数据流,或者在条件拆分(我的偏好,对其他开发人员更可见)中使用它来记录失败时的连接错误,否则正常进行。
于 2013-03-09T14:40:55.110 回答