Сравнение и синхронизация структуры таблиц баз данных SQL Server

Таблицы

Сравнивать и синхронизировать Tables.

Параметры сравнения и синхронизации структуры таблиц баз данных SQL Server, включая порядок следования полей, ANSI_NULLS, ANSI_PADDING и заполнение значениями из Default Constraints или по умолчанию
Создавать

Создавать новые, если их нет в целевой базе данных.

Изменять

Изменять существующие, чтобы устранить различия. Все столбцы, которые не существуют в той же таблице шаблонной базы данных, – будут потеряны. При необходимости переименовать столбец – вы должны предоставить свой собственный скрипт для этого. Используйте функцию «Выполнять скрипты», чтобы выполнить подготовительный скрипт до начала сравнения.

Перестраивать

Перестраивать (удалить и создать) существующие, чтобы устранить отличия. Все данные будут перенесены в новую таблицу. Все столбцы, которые не существуют в той же таблице шаблонной базы данных, – будут потеряны. При необходимости переименовать столбец – вы должны сделать свой собственный скрипт для этого. Используйте функцию «Выполнить скрипт», чтобы выполнить подготовительный скрипт до начала сравнения.

Удалять

Удалять существующие, если их нет в шаблонной базе данных. Все данные удаленных таблиц будут потеряны.

Порядок столбцов

Привести в соответствие порядок следования столбцов.

ANSI_NULLS

Если эта опция не установлена, то алгоритм сравнения будет игнорировать параметр ANSI_NULLS для таблиц. Настоятельно рекомендуется всегда использовать эту опцию в сравнении.

ANSI_PADDING

Если эта опция не установлена, то алгоритм сравнения будет игнорировать параметр ANSI_ PADDING для таблиц. Настоятельно рекомендуется всегда использовать эту опцию в сравнении.

Заполнять новые столбцы из Default Constraints

Заполнять данные новых столбцов из выражения их констрейна по умолчанию.

Заполнять NOT NULL столбцы из Default Constraints

Заполнять данные NOT NULL столбцов из выражения их констрейна по умолчанию.

Заполнять NOT NULL столбцы значениями по умолчанию

Заполнять данные NOT NULL столбцов значением их типа по умолчанию (такими как '', 0, 0x, '1900-01-01'), если констрейн по умолчанию отсутствует или соответствующая опция не установлена.

Заполнять '1900-01-01' вместо GETDATE () и т.д.

Заменять функции получения текущей даты типа GETDATE() минимальным допустимым значением даты при заполнении значений столбцов.


Пересоздание таблицы для изменения порядка следования столбцов, ANSI_PADDING или ANSI_NULLS

При необходимости пересоздать таблицу, AutosyncDB использует хранимую процедуру sp_rename, чтобы переименовать существующую таблицу, создать новую с таким же именем, а затем перенести в нее данные и удалить прежнюю. Вызов sp_rename также приводит к предупреждению, которое следует игнорировать:

Caution: Changing any part of an object name could break scripts and stored procedures.

Вызов sp_rename в данном случае не может нанести вред целостности структуры БД, т.к. переименованная таблица в последствии удаляется.

Пример пересоздания таблицы с комментариями

-- ... удаление констрейнов, индексов, триггеров, представалений и других зависимых объектов...
-- опции
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON;
GO
SET ANSI_PADDING ON;
GO
-- переименовать существующую таблицу, чтобы можно было создать новую с таким же именем
-- получем сообщение "Caution: Changing any part of an object name could break scripts and stored procedures."
EXECUTE sp_rename N'[dbo].[Events]', N'Events##TEMP', 'OBJECT';
GO
-- создаем новую таблицу
CREATE TABLE [dbo].[Events]
(
  [IdEvents] int NOT NULL IDENTITY,
  [Name] varchar(500) NULL,
  [Dsc] varchar(1000) NULL,
  [Expires] int NULL,
  [DateIns] datetime NOT NULL,
  [DateUpd] datetime NULL,
  [DateDel] datetime NULL
)
ON [PRIMARY]
GO
-- переносим данные, следим чтобы правильно перенести поле IDENTITY
SET IDENTITY_INSERT [dbo].[Events] ON;
GO
INSERT INTO [dbo].[Events] ([IdEvents], [Name], [Dsc], [Expires], [DateIns], [DateUpd], [DateDel])
SELECT [IdEvents], [Name], [Dsc], [Expires], [DateIns], [DateUpd], [DateDel]
	FROM [dbo].[Events##TEMP];
GO
SET IDENTITY_INSERT [dbo].[Events] OFF;
GO
-- переносим последние значение IDENTITY
DECLARE @seed bigint;
SET @seed = IDENT_CURRENT('[dbo].[Events##TEMP]');
IF @seed IS NOT NULL
	DBCC CHECKIDENT('[dbo].[Events]', RESEED, @seed) WITH NO_INFOMSGS;
GO
-- проверяем, все ли данные мы перенесли и удаляем прежнюю таблицу
IF (SELECT COUNT(1) FROM [dbo].[Events]) = (SELECT COUNT(1) FROM [dbo].[Events##TEMP])
	DROP TABLE [dbo].[Events##TEMP];
ELSE
	PRINT N' * ERROR: Lost data! Unable to copy rows from the old renamed table [dbo].[Events##TEMP] to the new.';
GO
--
-- ... создание констрейнов, индексов, триггеров, представлений и других зависимых объектов...