需要更改生产数据库中的列类型(SQL Server 2005)

时间:2011-03-16 17:29:10

标签: sql sql-server sql-server-2005 transactions

我需要帮助编写TSQL脚本来修改两列的数据类型。

我们正在更改两列:

  • uniqueidentifier - > varchar(36)* * *具有主键约束
  • xml - >为nvarchar(4000)

我主要担心的是脚本的生产部署......

公共网站积极使用该表,每小时可获得数千次点击。因此,我们需要脚本快速运行,而不会影响前端的服务。此外,如果发生错误,我们需要能够自动回滚事务。

幸运的是,该表只包含大约25行,所以我猜测更新会很快。

此数据库是SQL Server 2005。

(仅供参考 - 由于第三方工具与SQL Server的xml和uniqueidentifier类型不兼容,因此需要更改类型。我们已经测试了dev中的更改,并且更改没有任何功能问题。)

3 个答案:

答案 0 :(得分:6)

正如David所说,在生产数据库中执行脚本而不进行备份或停止站点不是最好的想法,如果你想只在一个表中做更改,行数减少就可以准备一个脚本:

  • 开始交易
  • 用final创建一个新表 你想要的结构。
  • 复制原始表格中的数据 到新表
  • 将旧表重命名为,例如, original_name_old
  • 将新表重命名为 original_table_name
  • 结束交易

这将以一个名为原始表但具有所需新结构的表结束,此外,您还使用备份名称维护原始表,因此如果要回滚更改,可以创建脚本简单地删除新表并重命名原始表。

如果表有外键,脚本会更复杂一些,但仍然没有太多工作。

答案 1 :(得分:2)

  

因此,我们需要脚本来   快速运行,不影响服务   在前端。

这只是一个意见,但它是基于经验:这是一个坏主意。最好有一个简短的(预先宣布的,如果可能的话)计划停机时间而不是承担风险。

唯一的例外是,如果您真的不在乎这些表中的数据是否已损坏,并且您可能会长时间停机。

在这种情况下,根据您正在进行的更改类型以及您已经执行的测试,听起来风险非常小,因为您已经测试了更改并且您应该能够执行此操作安全,但没有任何保证。

首先,如果出现问题,您需要有一个后备计划。 MINIMAL合理计划的简短版本包括:

  • 关闭网站
  • 备份数据库
  • 运行您的脚本
  • 测试数据库的完整性
  • 将网站重新上线

在网站上线时尝试进行此类更新是非常不明智的。如果出现问题,你可能会长时间宕机。

GOOD计划还会让您首先针对数据库副本和网站副本(测试/暂存环境)对此进行测试,然后采取上述步骤进行实时服务器更新。 你已经这样做了。感谢你!

有更好的方法可以进行这样的更新,但在大多数情况下,安全停机时间的权衡是明智的。

答案 2 :(得分:1)

如果您绝对需要在现场直播,那么您可能会考虑这个:

1)使用新的数据类型和复制的数据构建表的脱机版本。 2)在离线表上构建所有必需的键和索引。 3)在交易中交换表格。 00你可以将旧表重命名为其他东西作为紧急备份。

sp_help 'sp_rename'

但是在类似环境的环境中测试所有这些。并确保您的备份是最新的。并在你最不忙的时候这样做。