如何在迁移中自动删除约束DF_

时间:2019-11-26 09:45:17

标签: sql sql-server flyway

我有一张看起来像这样的桌子:

create table job_results
(
    id                bigint identity
        constraint pk_job_results
            primary key,
    created           datetime2,
    deleted           datetime2,
    updated           datetime2,
    job_id            varchar(255)      not null
        constraint fk_job_results__job_id
            references jobs,
    location          varchar(1024)     not null,
    sent_successfully bit     default 1 not null,
    send_attempts     tinyint default 0 not null,
    is_partial        tinyint default 1 not null
)

现在,我使用flyway进行迁移,但是当我无法创建将is_partialtinyint更改为bit的迁移时,遇到了这个问题,因为MSSQL创建约束,该约束防止名为DF__job_resul__is_pa__3632CAAD的迁移-通常我会删除它,但是此约束具有后缀3632CAAD,它是随机生成的,因此,当我清理数据库并再次运行flyway时,约束不会被删除,因为它不存在,我也不知道当前的后缀是否可以删除。

那么,有没有一种方法,如何通过某些正则表达式或其他方法自动删除此特定约束?

我当前的迁移如下:

alter table job_results
    alter column is_partial bit not null;
go

错误消息:

SQL State  : S0001
Error Code : 5074
Message    : The object 'DF__job_resul__is_pa__3632CAAD' is dependent on column 'is_partial'.

1 个答案:

答案 0 :(得分:1)

我最终设法在自己的案例中使用了此https://stackoverflow.com/a/10758357/7169288解决方案,因此最终迁移如下:

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('job_results') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'is_partial' AND object_id = OBJECT_ID(N'job_results'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE job_results DROP CONSTRAINT ' + @ConstraintName)
go

alter table job_results
    alter column is_partial bit not null;
go