3

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

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

问题:

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

4

4 回答 4

4

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

  1. 尝试在受影响的用户数量最少时安排中断,发布信息让用户提前知道
  2. 使用数据定义语言 (DDL) 脚本对数据库表进行更改,并可能使用数据操作语言 (DML) 脚本将现有数据转化为更改所需的内容。

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

于 2011-05-14T21:54:12.587 回答
2

您要么需要:

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

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

于 2011-05-14T21:55:06.270 回答
1

大多数情况下,我们创建发布脚本,其中的更改被脚本化并且可重复。所以你会看到类似的东西

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 个不同的数据库,但这是有代价的。

于 2011-05-14T22:00:29.250 回答
0

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

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

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

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

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

于 2011-05-15T13:04:19.770 回答