如何在运行时确定我是否连接到生产数据库?

时间:2012-04-03 21:36:03

标签: sql-server database wcf version slowcheetah

好的,所以我做了愚蠢的事情并发布了针对我们的开发数据库(SQL Server 2008 R2)的生产代码(C#,VS2010)。幸运的是,我们还没有使用生产数据库,所以我没有尝试恢复和同步所有内容的痛苦......

但是,我想要防止这种情况再次发生,因为它可能会更加痛苦。我的想法是添加一个我可以在启动时查询的表,并通过返回的值确定我连接的数据库。生产将返回“PROD”,dev和test将返回其他值,例如。

如果它有任何区别,应用程序会与WCF服务通话以访问数据库,因此我在配置文件中有端点,而不是实际的连接字符串。

这有意义吗?其他人如何解决这个问题?

谢谢, 戴夫

4 个答案:

答案 0 :(得分:5)

解决此问题的最简单方法是无法访问生产帐户。这些存储在我们的.net应用程序的Machine.config文件中。在非.NET应用程序中,通过在公共位置具有配置文件,或者(我敢说)具有保存帐户信息的注册表条目,这很容易复制。

我们的大多数服务器也通过别名访问,因此没有人真正需要将连接字符串从环境更改为环境。只需从配置中获取用户,hosts文件中的服务器别名就会指向正确的服务器。这也消除了我们在切换数据库实例(更改硬件等)时更新所有配置文件的麻烦。

即使点击一次部署和结束点也是如此。您可以在最终用户桌面上的机器配置中发布新的端点URI(我假设这是一个内部应用程序),然后在代码中引用它。

如果你绝对不能这样做,因为这可能是很多工作(我工作的最后一个地方有2000个呼叫中心的人,所以这个推动要困难得多,但仍然可能)。您始终可以使用自动构建服务器设置来修改app.config文件,作为为您构建应用程序的最后一步。然后,您始终从自动构建服务器发布已编译的代码。从来没有对app.config进行更改,因为这是开发人员流程中的手动步骤。这在某些时候总会导致问题。

现在,如果这一切都不起作用,你最后的选择(也是这样做的),我讨厌,但它的工作原理是查找映射驱动器的值。从本质上讲,公司中的每个人都有一个映射驱动器来说R:。这是您拥有生产配置文件等的地方.Prod帐户人员使用生产值映射到一个驱动器位置,开发人员等使用开发值映射到另一个驱动器位置。与其他人相比,我讨厌这个选项,但是它有效,而且它可以让你陷入困境,其他人变得乏味和困难(因为说办公室政治,建立一个构建服务器等)。

答案 1 :(得分:2)

我假设您的生产服务器的名称与开发服务器的名称不同,因此您只需SELECT @@SERVERNAME AS ServerName

答案 2 :(得分:1)

不确定这个答案是否会在假定的.net环境中帮助您,但在* nix / PHP环境中,这就是我处理相同情况的方法。

  

好的,所以我做了蠢事并发布了生产代码

有些时候某些应用行为与环境有关,正如您所想到的那样。为了提供在开发和生产环境之间进行检查的能力,我将以下行添加到全局/etc/profile/profile.d/custom.sh config(CentOS)中:

SERVICE_ENV=dev

在代码中我有一个包装器方法,它将根据名称获取环境变量并本地化它的值,使我的应用程序代码可以访问它。下面是一个片段,演示如何检查当前环境并做出相应的反应(在PHP中):

public function __call($method, $params)
{
    // Reduce chatter on production envs
    //  Only display debug messages if override told us to
    if (($method === 'debug') &&
        (CoreLib_Api_Environment_Package::getValue(CoreLib_Api_Environment::VAR_LABEL_SERVICE) === CoreLib_Api_Environment::PROD) &&
        (!in_array(CoreLib_Api_Log::DEBUG_ON_PROD_OVERRIDE, $params))) {
        return;
    }
}

请记住,除了片段所示的一些极端用例之外,您不希望将您的应用程序逻辑与环境检查结合起来。相反,您应该使用DNS控制对生产数据库的访问。例如,在开发环境中,以下db hostname mydatabase-db将解析为本地服务器而不是实际的生产服务器。当您将代码推送到生产环境时,您的DNS将正确解析主机名,因此您的代码应该“正常工作”而无需任何环境检查。

答案 3 :(得分:1)

经过几个小时的关于MSBuild和app.config操作的教科书和教程,我偶然发现了一个叫做SlowCheetah的东西 - XML Transforms http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5,它在第一次遇到它后不到一个小时就完成了我需要做的事情。绝对推荐!来自文章:

此程序包使您可以根据构建配置转换app.config或任何其他XML文件。它还添加了额外的工具来帮助您创建XML转换。

这个包由Sayed Ibrahim Hashimi,Chuck England和Bill Heibert创建,他是同一个Hashimi,他在MSBuild上撰写了这本书。如果您正在寻找一种简单无处不在的方式来转换您的app.config,web.config或任何其他基于构建配置的XML文件,请不要再看了 - 这个VS包将完成这项工作。

是的,我知道我回答了自己的问题,但我已经给出了答案,最终指出了真正的答案。现在我需要根据我对问题的新理解回过头来编辑问题......

戴夫