我有一个为我的公司开发的基于SQL3.5/ .Net 2008的内部企业应用程序。
我有两种类型的数据库。主系统数据库,它包含我们所有的全局数据,如用户名和客户等。以及项目数据库,它包含与我们的客户项目相关的实际数据。
当系统为客户创建新项目时,它需要使用提供表、视图、sps等的自定义架构来配置新的SQL数据库。项目数据库的名称与系统数据库中存储的项目的项目ID相对应。因此,一个新项目将创建一个新的项目数据库,其名称为: Project_XXX,其中XXX是项目id。
我的问题是,以编程方式提供自定义数据库的最佳方式是什么?现在,我能想到的唯一方法就是创建一个类,它从文件系统中读取SQL脚本,并执行解析来替换数据库名称的项目ID。这很容易,但看起来很不优雅。
有没有一些老手更喜欢的方法?
发布于 2008-11-18 02:24:14
一般来说,如果只有一个(或几个)数据库,并且您可以直接控制它们(通常是所有企业环境),我建议不要自动升级数据库,因为这比它的价值更麻烦。只需将脚本传递给执行安装的人员即可。
对于过去更广泛的发行版,我按照您的建议使用了一个脚本和SQL Server SMO库(Server.CurrentContext.ExecuteNonQuery())。我并不觉得它不优雅,因为它很简单,而且很有效。
对于第一个版本,我们将包括一个完整的DB构建脚本,然后为每个后续版本添加一个升级脚本。因此,如果有人在v1.1上安装v1.2,我们将只运行v1.2脚本。但是,如果他们进行全新安装,我们将运行v1.0、v1.1和v1.2。
发布于 2008-11-18 02:46:58
我认为最好的方法是在您的源代码控制服务器上维护脚本;毕竟,它是您的系统基础设施的很大一部分的源代码,并且将从适当的代码维护、测试等中受益。然后从那里安装即可。
如果您对此架构有任何纠结的疑问,我假定您对每个项目单独的数据库有更多的不确定。我称它为Big Denorm;我已经在许多上下文中看到过它很多次,但我还没有看到它得到很好的结果。我甚至认为它是一种反模式。
发布于 2008-11-18 03:49:38
由于你使用的是Linq3.5,你可能想要考虑使用.NET。LINQ能够使用映射文件或您创建的强类型DBML文件动态创建数据库(link to howto)。我相信它可以在多个地方创建合适的表。这可能适用于简单的数据库。
但是,如果您在非主键上使用函数、存储过程和/或索引,我看不出它是如何工作的。映射文件也许能够跟踪这些,但我从来没有使用过,所以我持怀疑态度。可能@doofledorfer关于使用SQL脚本在新数据库中重新创建数据库结构的想法是可行的。我通常会把这些脚本放在我的源代码控制中。
如果你还没有这样做,你可能会想看看管理更新的工具。当您的代码/ db更改时,您可能需要在现有项目中滚动任何db更改。我们已经使用Red Gate SQL工具获得了很好的结果。
https://stackoverflow.com/questions/297652
复制相似问题