我有点困惑,需要你的帮助。我有一个包含 150 多个表的数据库。我有几个应该支持 Unicode 的字段,但现在它们不支持,因此我想在此过程中将列数据类型更改为 ntext 和 nvarchar,我必须删除约束然后再次创建它们。删除约束并再次创建它们是否安全。
*我有 286 列要更改,只是不知道在此过程中必须删除和创建许多约束。
*我想知道的是,改变一个成熟项目的列数据类型是否安全。
我有点困惑,需要你的帮助。我有一个包含 150 多个表的数据库。我有几个应该支持 Unicode 的字段,但现在它们不支持,因此我想在此过程中将列数据类型更改为 ntext 和 nvarchar,我必须删除约束然后再次创建它们。删除约束并再次创建它们是否安全。
*我有 286 列要更改,只是不知道在此过程中必须删除和创建许多约束。
*我想知道的是,改变一个成熟项目的列数据类型是否安全。
如果您可以在数据库不活动的情况下执行此操作,那么它应该是安全的。要记住的重要事项是确保您记录了所有约束,它们都不会受到列类型更改的影响(或者如果它们是您已经减轻的)并且您清楚依赖关系在这些约束之间。
我想我只是说,确保你有一个清晰的流程并且你遵循它。
但是有一个更好的方法:你可以禁用索引。 请参阅 msdn。这保留了索引定义。
如果您在客户机器上运行此程序(例如使用安装程序),您应该将数据库置于单用户模式,以确保同时没有应用程序插入数据。这将允许不一致的数据,您将无法创建/启用索引。
编辑:(gbn评论后)
禁用很可能不适用于您的情况。
我们在升级数据库的时候也去掉了约束,一般都是save。其他方面已经被其他人提到过:您需要全部了解它们才能创建它们。有一些工具可以从现有数据库创建脚本,或者您可以自己编写。所有信息实际上都应该在数据库中。例如,您从管理工作室获得脚本,但只能一个接一个(据我所知)。
如果您在生产环境中执行此操作,则可以将数据库置于单用户模式以确保没有应用程序尝试使用它。
所有这些都可以使用 3rd 方比较工具以事务方式完成(全部完成或全部回滚)。
也就是说,您可以在开发中单独进行更改(使用 SSMS 进行更改)但生成“安全”更改和回滚脚本(但始终有备份)。
否则,这样做是安全的:如果有人当时正在使用数据库并且输入错误的数据或尝试没有索引的查询,则可能会出现问题。
3rd-party-tool-uses-transaction 方法在整个更改期间锁定对象。
当然,您可以一次做一个,而不是大爆炸,但这些工具仍然有用。
我们一直在进行模式更改,这是我们的一般程序:
对于每个表:
在 SQL Server Management Studio 中进行更改,您会注意到这些脚本会一直删除和重新创建约束,没有任何问题
生成脚本,将它们复制到文件中
取消更改(不要将它们应用于数据库)
转到与生产模式完全相同的测试/开发数据库并运行您的脚本
如果您有任何错误,请解决它们,恢复测试/开发并重新测试
如果你没有错误
根据需要进行备份
如有必要,安排与用户一起关闭应用程序
将数据库置于单用户模式,这将防止在缺少约束时更改任何数据
运行脚本文件
使数据库脱离单用户模式
您可以尝试禁用和启用它们的方法,而不是删除和重新创建约束。我不确定如果同时更改列类型这是否可行,但只要保持列名不变,就值得测试