在同一数据库中同时支持Beta版和正式版

时间:2019-04-24 13:06:36

标签: sql-server

我们正在使用将SQL Server作为后端数据库的产品。现在,我们有一个问题声明,即无论何时部署新版本,都必须由少数用户使用,而其他用户将继续使用旧版本。

在应用程序方面,我们可以维护两个实例,但数据库不能那样做,因为事务和主数据应该是单个的。数据库中的代码隔离是不可能的。

有输入吗?

注意:应用程序具有在数据库中维护的配置。

2 个答案:

答案 0 :(得分:1)

我们提供了三种支持数据库更改的方式,以允许推出应用程序的版本。这些解决方案之所以有效,是因为我们只允许存储过程访问表。

  1. 对于较小的更改,例如将参数添加到现有搜索中,我们确保更改以不间断的方式进行。例如,在向存储过程添加新参数时,我们默认将其设置为保持现有行为的值。

    CREATE PROCEDURE [DoSearch]
        @NAME VARCHAR(50),
        @BIRTHDAY DATE = NULL -- Defaults value means it's optional
    AS ...
    

注意:旧代码调用此存储过程时,不会传递@BIRTHDAY。但是,由于它具有默认值,因此SQL很高兴。

  1. 对于较大的更改(例如更改结果集),我们创建一个版本号添加到存储过程,并从更新的应用程序中调用该版本号:

    CREATE PROCEDURE [DoSearch_v2]
        @NAME VARCHAR(50)
    AS
        SELECT FIELD1, 
               FIELD2, -- different data type than v1 of stored procedure
               FIELD3, -- a field not returned by v1 of stored procedure
    
  2. 对于主要版本...

我们拥有数据库项目,使得表存在于一个数据库中,而存储过程存在于另一个数据库中。这意味着我们可以有两个非常不同的存储过程版本,但是指向相同的数据。

    CREATE DATABASE [App_Data] -- Only has tables
    CREATE DATABASE [App_SPROCS_V1] -- References [App_Data]
    CREATE DATABASE [App_SPROCS_V2] -- References [App_Data]

客户A的网站使用的是“旧”应用程序,因此指向[App_SPROCS_V1]。

B客户网站使用“新”应用程序,因此指向[App_SPROCS_V2]。

之所以行之有效,是因为,即使是进行重大升级,我们也很少对数据结构进行无法以不间断的方式完成的更改(例如添加列或表)。我们也只有十几个部署-如果您有一千个部署,您想做些不同的事情。

执行此操作的一个示例是将网站从.NET 4.x升级到.NET Core时。我们借此机会进行了大量的房屋清洁工作,并重新实现了功能。我们不想“弯曲”当前的存储过程,因此我们在[APP_SPROCS_V2]中创建了所有新存储过程。

答案 1 :(得分:0)

您想知道如何让系统的两个版本共享一个数据库-旧代码和新代码吗?如果没有任何模式更改,这应该不成问题。如果模式更改是附加的(新视图,新表,具有适当默认值的新列),通常也可以。

对于其他架构变更,您需要以这样的方式编写它们:新代码理解旧架构,将所有人从旧代码迁移到新代码,然后删除旧架构的所有残余。

可能有技巧。例如。如果您已重新排列给定数据集所在的表,则定义一个类似于旧存储方式的视图将允许新旧代码访问它-并且通过触发器,这也适用于要写入的表(但要注意性能问题)。

很难具体说明,因为它很大程度上取决于您的应用程序的工作,两个版本之间的更改以及数据库上有多少备用容量来进行解决。