Ben*_*ter 6 sql-server-2005 sql-server-2008 sql-server
背景:我的应用程序有多个并发版本在我的生产环境中运行。根据所使用的用户帐户,用户将有权访问不同版本的软件。
环境:目前是SQL Server 2005,即将迁移到SQL Server 2008,ASP.Net
问题:软件的每个版本可能使用也可能不使用与数据库中的数据交互的存储过程的不同版本。当前,当版本更改时,更改它的人会创建一个新副本并在末尾附加一个增量版本号。在这一点上,我们有一些存储过程的多个版本,而其他版本只有一个版本,没有人确定应用程序的哪个版本指向存储过程的哪个版本——这是一团糟。
我正在寻找一种解决方案,它将为任何给定版本的应用程序整齐地打包存储的过程,以用作新版本的基础。这意味着新版本的应用程序可以指向一组新的 procs,这些 procs 可以重写或修改为最终用户的内容,而不会影响当前生产中可用的其他版本的应用程序。
我最初考虑的是模式,但问题的一部分是 procs 与其他 procs 和用户定义的函数紧密耦合,所以当复制到另一个模式时,我们新来映射和替换所有这些并不理想的链接. 有没有办法编写 procs,以便将它们移动到另一个模式会带来它们之间的关系,例如,如果 Schema1.Proc1 引用了 Schema1.Proc2 并且我们将它们复制到 Schema2.Proc1 现在将引用的 Schema2 Schema2.Proc2 无需做任何额外的工作?在必须通过 SchemaX.Func1() 引用函数的情况下,这将如何处理用户定义的函数?如果我可以在不定义函数所属模式的情况下以与存储过程相同的方式引用该函数,那将会很方便,但我不
似乎这是一个应该已经解决的问题,但我不知道我在寻找什么才能找到可行的解决方案。
有没有人有任何想法?
小智 0
您需要以某种方式维护与每个软件版本相关的存储过程的列表。有很多方法可以做到这一点,但是版本/过程需要在某个地方清楚地记录下来,否则维护代码库将很困难(昂贵)并且最终会出现错误。
我想到的一种方法是维护过程及其版本的列表 - 作为数据库表或文本列表或 web.config 或编译到您的应用程序中。该列表将包含过程名称及其对应的版本(可能是基本版本)然后在代码中,您需要编写一个方法或类,它将以字符串形式获取相关过程名称,您可以将其返回到要使用的数据访问层 (DAL) - 我假设 DAL 知道要运行哪个查询。为了简单起见,有一个基本列表,然后只在需要的地方放入“版本”过程条目并获取最新的一个。
您可以更进一步,通过传递要在运行时替换到存储过程中的查询的查询文本或变量(过程名称、表名称)来动态创建所需的过程。即:如果过程 foo 需要调用过程 bar.vn,则将 bar.vn 作为变量传递给过程 foo。这允许您动态考虑不同的版本,但不允许数据库引擎有效地为该过程创建统计信息。这是如何编写类似内容的示例http://www.codeproject.com/Articles/11739/Dynamic-Sales-by-Week-Procedure-in-SQL-Server
最好的解决方案是不要同时拥有多个版本,尝试将不同的功能作为应用程序中的不同执行路径(代码或存储过程)。这意味着一些 IF..ELSE 位代码,看起来有点工作,但维护起来要容易得多,因为开发人员面前有替代方案 - 他们不需要知道哪个版本需要哪个过程。
| 归档时间: |
|
| 查看次数: |
1961 次 |
| 最近记录: |