У меня есть ряд столбцов в моей базе данных, которые изначально были созданы как smalldatetime
, и это действительно должно быть datetime
. Многие из этих столбцов были созданы с помощью DDL:
[columnname] smalldatetime not null default getdate()
... это означает, что для того, чтобы изменить тип столбца, я сначала должен удалить значение по умолчанию, а затем заново создать значение по умолчанию после его изменения.
Конечно, я не указал имя по умолчанию в DDL, поэтому все столбцы имеют значения по умолчанию с именами, такими как DF__CaseLock__CaseCo__182C9B23
. И когда мое приложение создает свою базу данных, оно делает это, выполняя сценарий, поэтому имена по умолчанию в базах данных моих клиентов (я полагаю; я не проверял это) отличаются от их имен в моих.
И даже если я знаю имя ограничения по умолчанию, я не могу понять синтаксис для добавления его обратно после его удаления. На самом деле, мне не ясно, что возможно добавить ограничение по умолчанию к существующему столбцу.
Похоже, что я должен сделать что-то вроде этого:
declare @t table (id int not null primary key, date smalldatetime null)
insert into @t (id, date)
select id, date_column from my_table
drop constraint constraint_name
alter table my_table drop column date_column;
alter table my_table add date_column datetime default getdate()
update my_table set date_column = t.date FROM my_table m JOIN @t t ON m.id = t.ID
... только я могу написать этот скрипт, только если знаю, что такое constraint_name
, потому что я не могу удалить столбец, на который ссылается ограничение.
Неужели это так сложно?