Sql server 2008 SSI通过服务器循环并处理失败的登录
创建一个包,该包将在我们不同环境(DEV、UAT、PROD)中的所有服务器之间循环。我们使用服务帐户,一个服务帐户用于DEV和UAT,另一个用于PROD。我使用ForEach循环容器/变量来设置连接字符串 问题:当循环中的数据流尝试连接到PROD服务器时,它们失败了,因为它们使用的是DEV/UAT服务帐户,而该帐户显然无权访问PROD,这很好。问题是这会终止循环。通常我会在数据流上放置一个事件处理程序,并设置事件处理程序的系统变量Propagate:OnError=False,这样错误就不会冒泡到循环中并杀死它。这是行不通的,因为数据流中的OLE DB连接在验证过程中失败(当包运行时),而且显然,Propagate=False设置仅在任务执行而不是任务验证过程中发生错误时才防止冒泡 我可以在包括包本身在内的所有东西上设置MaximumErrorCount=0,但这有点过于苛刻,无论遇到什么错误,包都会报告它成功运行 运行SQL Server 2008-R2Sql 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,这样错误就不会冒泡
如果有人不熟悉传播设置,如何使用该设置不终止循环。一个建议是将脚本任务放在数据流任务之前,该任务使用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;
}
我认为脚本任务可能能够提供我正在寻找的解决方案。非常感谢你。