创建一个将循环遍历不同环境(DEV,UAT,PROD)中所有服务器的包。我们使用服务帐户,DEV和UAT有一个服务帐户,PROD有另一个服务帐户。我正在使用ForEach循环容器/变量来设置连接字符串。
问题:当循环中的数据流试图连接到PROD服务器时,它们会失败,因为它们正在使用显然无法访问PROD的DEV / UAT服务帐户,这很好。问题是这会导致循环失败。通常我只是在数据流上放置一个事件处理程序并设置事件处理程序的系统变量传播:OnError = False,这样错误就不会冒泡到循环并杀死它。好吧,这不起作用,因为数据流中的OLE DB连接在验证期间失败(当程序包正在运行时)并且显然Propagate = False设置只会在执行任务期间发生错误而不会冒泡而不是任务的验证。
我可以在包括包本身在内的所有内容上设置MaximumErrorCount = 0,但这有点重,并且无论遇到什么错误,包都会报告它成功运行。
运行SQL Server 2008-R2
Link一篇关于如果有人不熟悉它,如何不使用传播设置杀死你的循环的文章。
答案 0 :(得分:2)
一个建议是在数据流任务之前放置一个脚本任务,该任务使用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;
}