创建一个程序包,该程序将遍历我们不同环境(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;
}
关于sql-server-2008 - SSIS遍历服务器并处理失败的登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15302274/