2009-04-21 15 views
2

我有点困惑,需要您的帮助。我有一个拥有超过150个表的数据库。我有几个字段应该支持Unicode,但现在他们不用,因此我想在此过程中将列数据类型更改为ntext和nvarchar,我必须删除约束然后再次创建它们。放弃约束并重新创建它是否安全?是否可以安全地删除,然后在数据库中创建约束条件

*我有286列改变,只是不知道在这个过程中必须删除和创建许多约束。

*我想知道的是,改变完全成长的项目的列数据类型是安全的。

回答

1

如果你可以做到这一点,而没有数据库是活的,那么它应该是安全的。要牢记的重要事项是确保您记录了所有约束条件,它们中的任何一个都不会受列类型更改影响(或者如果它们是为此而缓解的),并且您清楚依赖关系在这些限制之间。

我想我只是说,确保你有一个清晰的过程,并遵循它。

+2

而且对于所有神圣的事物的爱,先采取备份;-) – 2009-04-21 11:18:15

+2

我想这应该不用说,在进行任何更改之前进行备份将是一个非常好的主意! – KarstenF 2009-04-21 11:18:21

1

但还有更好的办法:你可以禁用索引。See on msdn。这保持了索引定义。

如果您在客户机器上运行(例如使用安装程序),您应该将数据库置于单用户模式,以确保没有应用程序正在同时插入数据。这将允许不一致的数据,并且您将无法创建/启用索引。

编辑:(后GBN评论)

禁用它很可能不是你的情况下工作。

我们还在升级数据库时删除约束条件,并且通常它是保存的。其他方面已被其他方面提及:你需要全部了解它们才能创造它们。有从现有数据库创建脚本的工具,或者您可以自己编写脚本。所有的信息都应该在数据库中。例如,你可以通过管理工作室获取脚本,但只能一个接一个(据我所知)。

如果您在高效环境中执行此操作,则可以将数据库置于单用户模式,以确保没有应用程序尝试使用它。

1

所有这些都可以通过第三方比较工具以事务方式完成(全部完成或全部回滚)。也就是说,您可以在开发中单独进行更改(使用SSMS进行更改),但会生成“安全”更改和回滚脚本(但始终有备份)。

否则,这样做很安全:如果某人当时正在使用数据库,并且输入了错误的数据或尝试使用没有索引的查询,则可能会出现问题。

第三方工具使用事务处理方法在整个更改期间锁定对象。

当然,你可以一次做一个,而不是大爆炸,但这些工具仍然有用。

0

我们进行模式时刻都在变化,这是我们在一般程序:

为每个表:

  • 使SQL Server Management Studio中修改,你会发现,这些脚本下降并重新创建约束都没有问题

  • 时生成脚本,将它们复制到文件

  • 取消更改(不要把它们应用到数据库)

去测试/开发数据库具有完全相同的模式生产和运行脚本

,如果您有任何错误,解决其中,恢复测试/开发和复试

,如果您有任何错误

  • 作出必要的备份

  • 时间表的广告应用程式与用户停机,如果有必要

  • 数据库置于单用户模式,这将防止改变任何数据的约束缺失时

  • 运行脚本文件

  • 以解除数据库的单用户模式

0

相反删除和重建的利弊您可以尝试使用disabling and enabling them的方法。我不确定,如果这可以工作,如果你同时改变列类型,但只要你保持列名不变,这是值得的测试

相关问题