sql-server-2008 - SSIS遍历服务器并处理失败的登录

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

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

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

我可以对包括软件包本身在内的所有东西都设置MaximumErrorCount = 0,但这有点笨拙,无论遇到什么错误,软件包都会始终报告它已成功运行。

运行SQL Server 2008-R2

Link上有关如何在用户不熟悉的情况下使用传播设置终止循环的文章。

最佳答案

一种建议是将脚本任务放在数据流任务之前,该任务使用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的变量。将其设置为 bool(boolean) 值,默认为False。
  • 创建脚本任务。编辑 ReadWriteVariables 属性并添加新变量。
  • 将您要用来从ForEach循环中构建连接字符串的任何变量添加到 ReadOnlyVariables 中。我已将其命名为ConnectionStringToTest。
  • 将上面的脚本代码添加为Main()函数。请注意,这使用OleDbConnection。这应该模仿您正在数据流中修改的连接管理器所使用的任何连接。因此,如果是SQL连接,请改用SqlConnection。
  • 在您的代码中,使用DatabaseCanConnect变量从此处确定流量。您可以在优先约束中使用它,以防止流向数据流,或在条件拆分中使用它(我的偏爱,其他开发者更清楚),以记录失败时的连接错误,否则按常规进行。
  • 关于sql-server-2008 - SSIS遍历服务器并处理失败的登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15302274/

    相关文章:

    mysql - 试图从 SQL Server 2008 二进制类型中提取数据

    sql - 如何填充分区数据中缺失的日期和值?

    sql - 我可以使用多个 "with"吗?

    php - 403禁止的错误-执行和Ajax页面

    c# - 如何跨不同的类返回多个变量

    ssis - 如何使 SSIS 包中的服务器名称动态化

    mysql - 如何在一个包内的 SSIS 中比较两个不同服务器上的两个表

    tsql - sql server 连接表值一次上传保存四次

    angular - 在 Angular 应用程序中抛出错误

    sql-server - 为什么 NULL 值在事实表中映射为 0?