Перестройка таблицы изменений схемы - PullRequest
2 голосов
/ 01 декабря 2011

Я работаю над сценарием, чтобы синхронизировать схемы таблиц.

Существует ли исчерпывающий список действий, выполняемых со схемой таблицы в MS SQL, для которых требуется отбрасывание и воссоздание таблицы и повторная вставка данных?

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Возможно, вам лучше стандартизировать стратегию CREATE-COPY-DROP-RENAME (CCDR) и пытаться вносить изменения на месте только в нескольких сценариях, где ваш DDL не потребует перестроения, а не пытается составить исчерпывающий список,Эта стратегия описана здесь: ссылка .

AFAIK, вам разрешено добавлять столбцы в существующую таблицу (без перестройки), если столбец:

  1. добавлено в конец таблицы AND
  2. может иметь значение NULL или иметь ограничение по умолчанию

Во всех других случаях MSSQL будет потенциально потерпеть неудачу, если не знает, что использовать в качестве значения в строках вновь добавленного столбца, или потеря данных является результатом (усечение, например).Даже добавленные по умолчанию столбцы, добавленные в середине, будут вызывать перестройку.

Чтобы еще больше усложнить ситуацию, в некоторых случаях успех развертывания будет зависеть от типа data в таблице, а не отпросто задействованная схема.Например, изменение длины столбца на большее значение (varchar(50) --> varchar(100)), скорее всего, будет успешным;однако уменьшение длины допускается только , иногда .Перенос изменений типа данных - еще один сложный случай.

Короче говоря, я бы всегда перестраивал и редко менял на месте.

-

Для иллюстрацииданные в строке, влияющие на результат:

create table dbo.Yak(s varchar(100));
insert into dbo.Yak
    values(replicate('a', 100));
go

-- attempt to alter datatype to 50 (FAIL: String or binary data would be truncated.)
alter table dbo.Yak 
    alter column s varchar(50);
go

-- shorten the data in row to avoid data loss
delete from dbo.Yak;
insert into dbo.Yak
    values(replicate('a', 50));
go

-- again, attempt to alter datatype to 50 (SUCCESS)
alter table dbo.Yak 
    alter column s varchar(50);
go

select len(s),* from dbo.Yak;
go

--cleanup
drop table dbo.Yak;
go
1 голос
/ 02 декабря 2011

Я очень испортился, используя проекты баз данных Visual Studio для управления такого рода вещами.После того, как моя схема импортирована в проект, я могу внести любое изменение, и VSDP выяснит, можно ли выполнить это изменение без удаления объектов (например, с помощью ALTER) или нужно ли создатьновый объект и скопируйте значения из старого (что он делает автоматически).

Запланируйте небольшую работу, чтобы понять, как вы будете вписывать это в вашу конкретную среду и рабочий процесс, но я нашел усилиябыть очень стоящим.

1 голос
/ 01 декабря 2011

В Management Studio выберите таблицу, которую вы хотите изменить, и щелкните правой кнопкой мыши Дизайн. Измените тип данных столбца в окне дизайна таблицы (проверено с int на money).

Вместо сохранения щелкните правой кнопкой мыши в окне и выберите «Создать сценарий изменения». Скопируйте операторы SQL из диалогового окна.

*) В предыдущих версиях (SQL2000) любые изменения воссоздали бы всю таблицу (насколько я помню). Похоже, что переименование и добавление столбцов были оптимизированы для операторов ALTER TABLE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...