Sql server 支持测试版和;同一数据库中的生产版本

Sql server 支持测试版和;同一数据库中的生产版本,sql-server,Sql Server,我们的产品以SQL Server作为后端数据库。现在我们遇到了一个问题,即无论何时部署新版本,都必须由少数用户使用,而其他用户将继续使用旧版本 在应用程序方面,我们可以维护两个实例,但数据库不能这样做,因为事务和主数据应该是单一的。数据库中的代码隔离是不可能的 有什么意见吗 注意:具有数据库中维护的配置的应用程序。您想知道如何让系统的两个版本共享一个数据库-旧代码和新代码?如果没有任何模式更改,这应该不是问题。如果模式更改是可添加的(新视图、新表、具有适当默认值的新列),通常也可以 对于其他模式

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

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

有什么意见吗


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

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

对于其他模式更改,您需要以这样的方式编写它们:新代码理解旧模式,将旧代码中的每个人都放到新代码中,然后删除旧模式的任何残余

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


很难说得更具体,因为这在很大程度上取决于应用程序的功能、两个版本之间的更改以及数据库上有多少备用容量来解决这些问题。

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

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

    CREATE PROCEDURE [DoSearch]
        @NAME VARCHAR(50),
        @BIRTHDAY DATE = NULL -- Defaults value means it's optional
    AS ...
    
  • 注意:当旧代码调用此存储过程时,
    @birth
    不会被传递。但是,由于它有一个默认值,SQL很高兴

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

    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
    
  • 对于主要修订

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

        CREATE DATABASE [App_Data] -- Only has tables
        CREATE DATABASE [App_SPROCS_V1] -- References [App_Data]
        CREATE DATABASE [App_SPROCS_V2] -- References [App_Data]
    
    Customer-A的网站使用“旧”应用程序,因此指向[App_SPROCS_V1]

    Customer-B的网站使用“新”应用程序,因此指向[App_SPROCS_V2]

    这是因为,即使对于主要的升级,我们也很少对数据结构进行无法以非中断方式完成的更改(例如添加列甚至表)。我们也只有12个部署——如果有1000个,你会想做一些不同的事情


    我们这样做的一个例子是我们将网站从.NET4.x升级到.NETCore。我们借此机会进行了大量的房屋清理,并重新实施了功能。我们不想“弯曲”当前的存储过程,所以我们在[APP_SPROCS_V2]中创建了所有新的存储过程。

    这里甚至没有问题。只是一个模糊的解释,您不能在多租户数据库中处理不同版本的应用程序。你期望得到什么答案?这个问题不允许免费午餐。如果您正在更改底层数据结构,那么没有一种自动的方法可以在不中断的情况下从A转到B——不可能有两个天空。如果你只是在改变逻辑,那么在很多方面都是可行的。我已经成功地使用了包含视图和存储过程的自定义模式,并根据需要更改了登录的默认模式。一个应用程序正在访问
    old.View
    ,而另一个应用程序正在访问
    new.View
    ,即使两者都使用
    View
    。或者你可以使用别名指向主数据库的独立数据库。我知道这是一个复杂的部分。但我想知道最好的方法。