【问题标题】:Is it safe to drop and then create the constraints in the database删除然后在数据库中创建约束是否安全
【发布时间】:2009-04-21 11:12:14
【问题描述】:

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

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

*我想知道的是,更改成熟项目的列数据类型是否安全。

【问题讨论】:

    标签: sql-server forum


    【解决方案1】:

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

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

    【讨论】:

    • 为了所有神圣的事物的爱,先备份;-)
    • 而且我想不用说在进行任何更改之前备份 将是一个非常好的主意!
    【解决方案2】:

    所有这些都可以使用 3rd 方比较工具以事务方式完成(全部完成或全部回滚)。

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

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

    3rd-party-tool-uses-transaction 方法在整个更改期间锁定对象。

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

    【讨论】:

      【解决方案3】:

      但是有一个更好的方法:你可以禁用索引。See on msdn。这保留了索引定义。

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

      编辑:(在 gbn 评论后)

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

      我们在升级数据库的时候也去掉了约束,一般都是save。其他方面已经被其他人提到过:您需要全部了解它们才能创建它们。有一些工具可以从现有数据库创建脚本,或者您可以自己编写。所有信息实际上都应该在数据库中。例如,您从管理工作室获得脚本,但只有一份一份(据我所知)。

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

      【讨论】:

      • 仍然存在需要 DROP 的依赖项。您不能禁用主键
      • 嗯,你可能是对的,在这种情况下禁用将不起作用。不幸的是。
      【解决方案4】:

      我们一直在进行架构更改,这是我们的总体流程:

      对于每个表:

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

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

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

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

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

      如果你没有错误

      • 根据需要进行备份

      • 如有必要,请与用户一起安排应用程序关闭

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

      • 运行脚本文件

      • 使数据库脱离单用户模式

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2015-07-02
          • 1970-01-01
          • 2011-10-07
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多