【问题标题】:Is there an easy way to add a custom migration script to SQL Compare scripts?是否有一种简单的方法可以将自定义迁移脚本添加到 SQL 比较脚本?
【发布时间】:2010-10-26 05:35:54
【问题描述】:

在我的工作中,我们目前在推动跨环境的数据库更改时遇到了一些严重的问题。当我们在现有表上创建一个新的不可为空的列时,问题开始出现。 SQL Compare 生成的脚本将该列创建为不可为空,因此它总是会失败。我希望有一些替代手动编辑脚本的方法。有没有办法解决这个问题?如果没有,你们是怎么处理的?

【问题讨论】:

    标签: sql migration redgate


    【解决方案1】:

    创建表:

    create table #bingo ( id int )
    

    添加一个值:

    insert into #bingo values (1)
    

    添加新列:

    alter table #bingo add userid int
    

    填充新列:

    update #bingo set userid = 1 where id = 1
    

    将新列更改为不可为空:

    alter table #bingo alter column userid int not null
    

    您必须手动编辑 RedGate Sql Compare 以使其像这样工作。

    【讨论】:

      【解决方案2】:

      您打算如何填充 NOT NULL 列?我看不出 SQL Compare 是如何真正提出解决方案的,因为它无法知道您将如何填充它。

      您可以使用 DEFAULT 创建列,然后只需在生成的脚本末尾添加一条更新语句,以在您有一些值的来源时正确更新该列。

      【讨论】:

      • 我希望有一种方法可以设置它,以便将所有列创建为可为空,然后为我留出空间来更新表,然后将列更改为非可以为空。
      【解决方案3】:

      在新的非空列上添加默认值

      当创建一个新的非空列时,所有现有的行得到什么值?如果您不知道,请将该列设为可为空。

      【讨论】:

      • 这取决于更改,但通常是从数据库本身中提取的。
      • @Correl,你怎么能期望现有表(有行)上的一个新的非空列在没有默认值的情况下工作?您可能希望在创建列后删除默认值,以强制您的应用程序插入一个好的值。
      • 我希望 RedGate 能给我一个在脚本中插入值的地方。就像将列创建为可为空一样,留一个空白部分让我添加我的自定义逻辑,然后将列更改为不可为空。我可以手动完成,但我希望 RedGate 可以让它变得更容易。
      猜你喜欢
      • 2021-08-21
      • 2020-02-26
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2020-01-16
      • 2021-06-19
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多