我有这样的表格:
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'.
我最终设法将这个 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