我有点困惑,需要您的帮助。我有一个拥有超过150个表的数据库。我有几个字段应该支持Unicode,但现在他们不用,因此我想在此过程中将列数据类型更改为ntext和nvarchar,我必须删除约束然后再次创建它们。放弃约束并重新创建它是否安全?是否可以安全地删除,然后在数据库中创建约束条件
*我有286列改变,只是不知道在这个过程中必须删除和创建许多约束。
*我想知道的是,改变完全成长的项目的列数据类型是安全的。
我有点困惑,需要您的帮助。我有一个拥有超过150个表的数据库。我有几个字段应该支持Unicode,但现在他们不用,因此我想在此过程中将列数据类型更改为ntext和nvarchar,我必须删除约束然后再次创建它们。放弃约束并重新创建它是否安全?是否可以安全地删除,然后在数据库中创建约束条件
*我有286列改变,只是不知道在这个过程中必须删除和创建许多约束。
*我想知道的是,改变完全成长的项目的列数据类型是安全的。
如果你可以做到这一点,而没有数据库是活的,那么它应该是安全的。要牢记的重要事项是确保您记录了所有约束条件,它们中的任何一个都不会受列类型更改影响(或者如果它们是为此而缓解的),并且您清楚依赖关系在这些限制之间。
我想我只是说,确保你有一个清晰的过程,并遵循它。
但还有更好的办法:你可以禁用索引。See on msdn。这保持了索引定义。
如果您在客户机器上运行(例如使用安装程序),您应该将数据库置于单用户模式,以确保没有应用程序正在同时插入数据。这将允许不一致的数据,并且您将无法创建/启用索引。
编辑:(后GBN评论)
禁用它很可能不是你的情况下工作。
我们还在升级数据库时删除约束条件,并且通常它是保存的。其他方面已被其他方面提及:你需要全部了解它们才能创造它们。有从现有数据库创建脚本的工具,或者您可以自己编写脚本。所有的信息都应该在数据库中。例如,你可以通过管理工作室获取脚本,但只能一个接一个(据我所知)。
如果您在高效环境中执行此操作,则可以将数据库置于单用户模式,以确保没有应用程序尝试使用它。
所有这些都可以通过第三方比较工具以事务方式完成(全部完成或全部回滚)。也就是说,您可以在开发中单独进行更改(使用SSMS进行更改),但会生成“安全”更改和回滚脚本(但始终有备份)。
否则,这样做很安全:如果某人当时正在使用数据库,并且输入了错误的数据或尝试使用没有索引的查询,则可能会出现问题。
第三方工具使用事务处理方法在整个更改期间锁定对象。
当然,你可以一次做一个,而不是大爆炸,但这些工具仍然有用。
我们进行模式时刻都在变化,这是我们在一般程序:
为每个表:
使SQL Server Management Studio中修改,你会发现,这些脚本下降并重新创建约束都没有问题
时生成脚本,将它们复制到文件
取消更改(不要把它们应用到数据库)
去测试/开发数据库具有完全相同的模式生产和运行脚本
,如果您有任何错误,解决其中,恢复测试/开发和复试
,如果您有任何错误
作出必要的备份
时间表的广告应用程式与用户停机,如果有必要
数据库置于单用户模式,这将防止改变任何数据的约束缺失时
运行脚本文件
以解除数据库的单用户模式
相反删除和重建的利弊您可以尝试使用disabling and enabling them的方法。我不确定,如果这可以工作,如果你同时改变列类型,但只要你保持列名不变,这是值得的测试
而且对于所有神圣的事物的爱,先采取备份;-) – 2009-04-21 11:18:15
我想这应该不用说,在进行任何更改之前进行备份将是一个非常好的主意! – KarstenF 2009-04-21 11:18:21