如果在没有使用配置文件条目覆盖每个pkg连接字符串的情况下运行包,则发出警告(或失败)

时间:2014-08-07 00:13:45

标签: ssis

SSIS软件包似乎是一个非常常见的问题,它将一个软件包发布到Production,最终会运行错误的连接字符串参数。这可能通过犯下许多错误或遗漏中的任何一个来实现。因此,我发现将所有ConnectionString值转储到日志文件会很有帮助。这有助于我了解在运行时实际应用于包的连接字符串。

现在,我正在考虑让我的包检查我的包中的每个连接对象是否通过配置文件中的条目覆盖了其连接字符串,如果没有,则返回警告甚至使包失败。这是为了通过将所有环境变量提取到配置文件来实现更轻松的配置。如果连接字符串永远不会被覆盖,那么当在生产中运行时,包在测试时在非生产设置中运行时,可能会使用开发设置或包,这可能会意外地针对生产运行。

我想借用可能尝试过这样做的人。我也对如何以最少的工作完成这项工作的建议感兴趣。

THX

2 个答案:

答案 0 :(得分:2)

技术问题1 - 我的连接字符串是什么

这是一个容易回答的问题。在您的包中,添加一个脚本任务并通过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及其连接字符串。

  • 信息:SCR Enum处的0x0,SCR枚举连接:CM_FF-&gt; C:\ ssisdata \ dba_72929.csv
  • 信息:SCR枚举时为0x0,SCR枚举连接:CM_OLE-&gt;数据源= localhost \ dev2012;初始目录= tempdb;提供者= SQLNCLI11;集成安全性= SSPI;

将其添加到...所有软件包的OnPreExecute事件中,没有人看到它,但每个报告都返回。

技术问题2 - 错过配置

我不知道任何允许包知道其配置的内容。我确定会发生一个事件,因为您会在信息/警告消息中看到某个软件包试图应用配置,但没有找到并且将保留它的设计时间价值。信息 - 我通过Y配置X.警告 - 尝试配置X但没有找到Y.但是如何让包检查自己找到它,我不知道。

那就是说,我已经看到了对错过配置的包失败的属性的引用。我现在没有看到它,但我确定它存在于一些缝隙中。您可以向dtexec提供/w参数,将警告视为错误,实际上,警告只是尚未成长的错误。

未说出口问题1 - 权限

我有一个朋友将XML配置文件作为其生产部署的一部分进行了拙劣。他们的生产服务器开始使用开发服务器的数据。坏事发生了。听起来你有类似的情况。分辨率很容易,可以隔离您的环境。您是否为生产类SQL Server框和dev / test / uat / qa / load / etc使用相同的服务帐户?停。做一个新的。不允许prod与任何不属于他们服务层的盒子交谈。有人咬了一个包并没有设置配置?首先,当它从开发到生产前的某些东西时,你会抓住它,因为该层不能与任何其他不是那个级别的东西交谈。但如果你是在超便宜的商店而且你只有开发和生产,那就这样吧。未配置的包将用于生产。 Prod SQL Agent会激活软件包。包使用默认连接管理器并且验证失败,因为它无法与开发销售数据库通信。

未说明的问题2 - 模板

当您要构建新程序包时,您的流程是什么?你的团队真的从头开始吗?有很多方法可以解决这个问题,但核心概念是将配置,日志记录,包保护级别,事务级别等的最佳实践定义为一些易于使用的形式。也许是3个初始包:一个用于原始采集,可能是一个阶段并且符合数据,最后一个将数据从符合到最终目的地。然后队友只需选择一个开始并填写需要它的位置。如果他们选择做自己的事情,当他们的包装无法在生产中运行时,你就会用它们击败它们,因为它们没有遵循标准路径。

此处还有其他方法。如果您是一名强大的.NET工作人员,您可以通过这种方式生成模板包。此时,我使用Biml创建模板,并使用它来驱动基本包创建。

答案 1 :(得分:0)

如果我理解正确,以下解决方案应该有效。

我的建议是打开软件包顶层的ProtectionLevel属性的“不保存敏感”选项。

这将要求您为每个连接使用包配置,否则它将没有用于建立连接的凭据。