这似乎是一个非常常见的问题与SSIS包是发布一个包到生产,最终运行错误的连接字符串参数。这可能是由于犯了许多错误或遗漏中的任何一个而发生的。因此,我发现将所有ConnectionString值转储到日志文件中是很有帮助的。这有助于我理解在运行时实际应用于包的连接字符串。
现在,我正在考虑让我的包检查,看看我的包中的每个连接对象是否有它的connectionstring被配置文件中的一个条目覆盖,如果没有,返回一个警告,甚至失败的包。这是为了通过将所有环境变量提取到配置文件中来简化配置。如果connectionstring从未被覆盖,那么在生产环境中运行的包可能会使用开发设置,或者在测试时在非生产环境中运行的包可能会意外地针对生产环境运行。
我想向任何可能尝试过这样做的人借用一下。我也很想知道如何用最少的工作来完成这个任务。
Thx
技术问题1 -我的连接字符串是什么
这个问题很容易回答。在包中,添加一个Script Task并枚举Connections集合。我触发OnInformation事件,如果我有这个计划,我一定要在我的dtexec中有/rep iew
选项,以确保我记录信息,错误和警告。
namespace TurnDownForWhat
{
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
/// <summary>
/// ScriptMain is the entry point class of the script. Do not change the name, attributes,
/// or parent of this class.
/// </summary>
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
bool fireAgain = false;
foreach (var item in Dts.Connections)
{
Dts.Events.FireInformation(0, "SCR Enumerate Connections", string.Format("{0}->{1}", item.Name, item.ConnectionString), string.Empty, 0, ref fireAgain);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
在我的包上运行,我可以看到我有两个连接管理器,CM_FF和CM_OLE以及它们的连接字符串。
- Information: 0x0 at SCR Enum, SCR Enumerate Connections: CM_FF->C:ssisdatadba_72929.csv
- Information: 0x0 at SCR Enum, SCR Enumerate Connections: CM_OLE->Data Source=localhostdev2012;Initial Catalog=tempdb;Provider=SQLNCLI11;Integrated Security=SSPI;
添加到…你的所有包的OnPreExecute事件,没有人看到它,但每个报告回来。
技术问题2 -遗漏配置
我不知道有什么东西可以让一个包知道它在配置中。我敢肯定有这样一个事件,你会在你的信息/警告消息中看到,一个包试图应用一个配置,没有找到一个,并将保留它的设计时间值。警告-试图配置X,但没有找到Y.但是如何让一个包检查自己来发现这一点,我不知道。
也就是说,我已经看到一个引用的属性在错过的配置上失败了。我现在看不见,但我肯定它存在于某个缝隙里。您可以向dtexec提供/w
参数,它将警告视为错误,实际上,警告只是尚未成长的错误。
未说明的问题1 -权限
我有一个朋友在他们的生产部署中搞砸了一个XML配置文件。他们的生产服务器开始使用来自开发服务器的数据。坏事发生了。听起来你也有类似的情况。解决办法很简单,隔离你的环境。您是否使用相同的服务帐户为您的生产类SQL Server盒和dev/test/uat/qa/load/等?停止。做一个新的。不要允许prod与任何不在其服务范围内的盒子对话。有人编写了一个包却没有设置配置?首先,当它从开发到生产前的某个阶段时,你会发现它,因为该级别无法与非该级别的任何其他内容进行对话。但如果你是在超级廉价的商店,你只有开发和产品,那就顺其自然吧。未配置的包转到prod. prod SQL代理启动包。包使用默认连接管理器,验证失败,因为它不能与dev sales数据库通信。
未说的问题2 -模板
当你有一个新包要构建时,你的过程是什么?你的团队真的是从零开始吗?有很多方法可以解决这个问题,但核心概念是将配置、日志记录、包保护级别、事务级别等方面的最佳实践定义为一些易于使用的形式。也许这是3个初始包:一个用于原始获取,一个用于整理数据,最后一个将数据从整理到最终目的地。然后队友只需选择一个开始,并填补需要它的位置。如果他们选择做自己的事情,那么当他们的包因为没有遵循标准路径而无法在生产环境中运行时,您就会用它来对付他们。
这里还有其他方法。如果你是一个强大的。net团队,你可以用这种方式生成你的模板包。在这一点上,我用Biml创建了我的模板,并使用它来驱动基本的包创建。
如果我理解正确,下面的解决方案应该工作。
我给你的建议是打开包顶层的ProtectionLevel属性的"不保存敏感"选项。
这将要求您为每个连接使用包配置,否则它将没有建立连接的凭据。