我有一张看起来像这样的桌子:
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_partial
从tinyint
更改为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'.
答案 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