Sql server 2008 SSI通过服务器循环并处理失败的登录

Sql server 2008 SSI通过服务器循环并处理失败的登录,sql-server-2008,error-handling,ssis,foreach-loop-container,Sql Server 2008,Error Handling,Ssis,Foreach Loop Container,创建一个包,该包将在我们不同环境(DEV、UAT、PROD)中的所有服务器之间循环。我们使用服务帐户,一个服务帐户用于DEV和UAT,另一个用于PROD。我使用ForEach循环容器/变量来设置连接字符串 问题:当循环中的数据流尝试连接到PROD服务器时,它们失败了,因为它们使用的是DEV/UAT服务帐户,而该帐户显然无权访问PROD,这很好。问题是这会终止循环。通常我会在数据流上放置一个事件处理程序,并设置事件处理程序的系统变量Propagate:OnError=False,这样错误就不会冒泡

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

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

我可以在包括包本身在内的所有东西上设置MaximumErrorCount=0,但这有点过于苛刻,无论遇到什么错误,包都会报告它成功运行

运行SQL Server 2008-R2


如果有人不熟悉传播设置,如何使用该设置不终止循环。

一个建议是将脚本任务放在数据流任务之前,该任务使用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;
            }
  • 在包范围内创建名为DatabaseCanConnect的变量。将其设置为Boolean,则默认为False
  • 创建脚本任务。编辑ReadWriteVariables属性并添加新变量
  • 将用于从ForEach循环构建连接字符串的任何变量添加到ReadOnlyVariables。我把我的连接命名为StringToTest
  • 添加上面的脚本代码作为Main()函数。请注意,这将使用OLEDB连接。这应该模拟您在数据流中修改的连接管理器所使用的任何连接。因此,如果是SQL连接,请改用SqlConnection
  • 在代码中,使用DatabaseCanConnect变量从这里确定流。您可以在优先约束中使用它来阻止数据流的流动,或者在条件拆分中使用它(我的首选项,其他开发人员更容易看到)来记录失败时的连接错误,否则继续正常操作

  • 我认为脚本任务可能能够提供我正在寻找的解决方案。非常感谢你。