是否可以安全地删除然后在数据库中创建约束

时间:2009-04-21 11:12:14

标签: sql-server forum

我有点困惑,需要你的帮助。我有一个包含150多个表的数据库。我有几个字段应该支持Unicode,但现在他们不这样做,因此我想在这个过程中将列数据类型更改为ntext和nvarchar我必须删除约束,然后再次创建它们。删除约束并再次创建约束是否安全。

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

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

5 个答案:

答案 0 :(得分:1)

如果您可以在没有数据库生效的情况下执行此操作,那么它应该是安全的。要记住的重要事项是确保记录所有约束条件,它们都不会受到列类型更改的影响(或者如果它们已经减轻了它们),并且您清楚了解依赖项在这些限制之间。

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

答案 1 :(得分:1)

但有更好的方法:您可以停用索引。 See on msdn。这保留了索引定义。

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

编辑(经过gbn评论后)

禁用很可能不适用于您的情况。

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

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

答案 2 :(得分:1)

所有这些都可以通过第三方比较工具以事务方式完成(全部或全部回滚)。

也就是说,您可以在开发中单独进行更改(使用SSMS进行更改),但生成“安全”更改和回滚脚本(但总是有备份)。

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

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

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

答案 3 :(得分:0)

我们一直在进行架构更改,这是我们的一般程序:

每张表

  • 在SQL Server Management Studio中进行更改,您会注意到这些脚本会一直删除并重新创建约束而没有任何问题

  • 生成脚本,将其复制到文件

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

使用与生产完全相同的模式转到测试/开发数据库并运行脚本

如果您有任何错误,请解决它们,恢复测试/开发并重新测试

如果没有错误

  • 根据需要进行备份

  • 如有必要,安排应用程序停止使用

  • 将数据库置于单用户模式,这样可以防止在缺少约束时更改任何数据

  • 运行脚本文件

  • 将数据库从单用户模式中删除

答案 4 :(得分:0)

您可以尝试disabling and enabling them的方法,而不是删除和重新创建约束。我不确定如果同时更改列类型是否可行,但只要保持列名不变就值得测试