【问题标题】:How to make live changes to SQL server express如何对 SQL Server Express 进行实时更改
【发布时间】:2011-08-25 16:31:12
【问题描述】:

我一直在使用 VS Studio 开发一个 asp.net 网络应用程序。我正在使用 SQL Server Express。 在开发过程中,我一直在我的服务器上测试我的网络应用程序。

每次我需要更新我的数据库时,我都会删除我的旧数据库(位于我的服务器上)并上传我的新数据库。由于我只是在测试,而我的应用没有用户,所以这不是问题。

问题:

我的网站上线后,我不知道如何更改我的数据库。显然我不能简单地删除它,因为它将包含用户数据。那么人们通常如何更新实时数据库。也就是说,假设我的网站已经上线,现在我需要向我的数据库添加更多表和存储过程。我将如何在实时网站上执行此操作?

【问题讨论】:

    标签: sql sql-server database live-update


    【解决方案1】:

    要更改生产数据库,您需要:

    1. 尝试在受影响的用户最少时安排中断,发布信息让用户提前了解
    2. 使用data definition language (DDL) scripts to make the changes to the database tables, and potentially data manipulation language (DML) scripts 将现有数据转化为更改所需的内容。

    第 2 步所需的脚本应该已经在开发和测试/QA 环境中进行了测试,以确保在生产系统中遇到的问题尽可能少。开发和测试/QA 环境都需要允许您将数据库恢复到应用程序以前版本的备份。

    【讨论】:

      【解决方案2】:

      您需要:

      • 在没有人使用该站点的时候更新您的数据库。或
      • 确保您的更新不会影响网站的运行。

      第二个选项涉及为任何新的不可为空的列提供合理的默认值,确保所有 INSERT 语句都使用列列表(例如INSERT INTO dbo.MyTable (col1, col2, col3) VALUES (...))并确保新的存储过程参数具有默认值。这不是一份详尽的清单,而是一个好的开始。

      【讨论】:

      • 读取数据的用户也会受到影响——确保没有人在使用系统就不会那么令人头疼了。
      • 是的。在单个事务中运行所有模式 + 数据更新有多可行?当然,我假设正在使用“正确的”隔离级别,并且代码中没有乱七八糟的 (NOLOCK)。 :)
      • 在单笔交易中?任何错误,包括整个操作的最后一项错误,都会触发ROLLBACK——可能会非常令人沮丧。
      • 真的吗?除非使用 try/catch 并且事务在 catch 块中回滚,否则它不会(可能)在该点停止批处理并使事务半生不熟吗?
      • 你无法恢复进程,你有一个错误需要处理。
      【解决方案3】:

      大多数情况下,我们会创建发布脚本,以便将更改编写成脚本并可重复。所以你会看到类似的东西

      IF NOT EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                  WHERE TABLE_NAME = 'myTableName' 
                 AND  COLUMN_NAME = 'myColumnName')
      BEGIN
           ALTER TABLE myTableName
           ADD myColumnName varchar(50)
      END
      

      您可以通过以下内容判断哪些对象发生了变化:

      SELECT
      [name],
      create_date,
      modify_date
      FROM sys.tables
      ORDER BY
      modify_date DESC
      

      有些人使用 RedGate 软件来比较 2 个不同的数据库,但这样做是有成本的。

      【讨论】:

        【解决方案4】:

        这取决于您要对实时数据库进行的更改。

        在您的问题中,您只谈论添加新表和存储过程。
        只要您只添加新的东西(表、存储过程,甚至是现有表的新列),您就不必做任何特别的事情,因为 SQL Server 可以在使用数据库时执行此操作并且这些更改不会影响您的用户,因为他们的应用版本甚至不知道您新添加的内容。

        另一方面,如果您更改甚至删除现有内容,情况会变得更加复杂。
        这很有可能对您的应用程序造成重大影响,因为当表看起来与预期不同时,或者如果它尝试访问不再存在的表/存储过程,它可能会停止工作。
        (即使你只是像我一开始所说的那样添加新的东西——你可能还是想更新你的应用程序,所以它实际上可以使用数据库中的新东西)

        因此,您可能需要同时更改数据库并部署新版本的应用。

        我不是 ASP.NET 专家,但据我所知,如果所有活动用户都被踢出,就不可能更新 ASP.NET 应用程序。
        因此,在这种情况下,您必须执行 what OMG Ponies already said:选择受影响的用户数量最少的时间,和/或尽早通知您的用户计划的中断。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 2011-04-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多