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

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

Таблицы

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

Создавать

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

Изменять

Изменять существующие, чтобы устранить различия.

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

Пересоздавать

Пересоздавать (удалить и создать) существующие, чтобы устранить отличия. Все данные будут перенесены в новую таблицу.

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

Удалять

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

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

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

ANSI_NULLS

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

ANSI_PADDING

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

FILEGROUP / PARTITION SCHEMA

Установите этот параметр, чтобы изменить файловую группу (или схему секционирования) таблиц, ограничений и индексов. В противном случае алгоритм сравнения попытается унаследовать эти значения от существующих объектов. Соответствующие файловые группы и схемы секционирования должны существовать в целевой базе данных. Количество секций может отличаться.

DATA_COMPRESSION

Установите этот параметр, чтобы изменить сжатие данных таблиц, ограничений и индексов. Иначе алгоритм сравнения попытается унаследовать эти значения от существующих объектов.

Даже если файловые группы или схемы секционирования разные

Также изменить сжатие данных объектов, которые имеют разные файловые группы или схемы секционирования.

Использовать тип компрессии данных последней секции

Если в целевой базе данных больше секций, чем в шаблонной, оставшиеся будут использовать тип сжатия данных последней секции из шаблонной базы данных. Иначе тип сжатия этих секций не будет учитываться.

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

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

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

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

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

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

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

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



Подход к пересозданию таблиц

Бывают случаи, когда оператора ALTER недостаточно, и таблица должна быть полностью пересоздана. Например, чтобы изменить порядок следования столбцов, тип таблицы, ANSI_PADDING или ANSI_NULLS. AutosyncDB использует системную хранимую процедуру sp_rename, чтобы переименовать существующую таблицу, а затем создает новую с исходным именем, копирует в нее данные и удаляет старую.

Во время выполнения такого скрипта вызов sp_rename вызывает предупреждение,

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

которое следует игнорировать. Все дочерние объекты и объекты, ссылающиеся на старую таблицу, удаляются перед переименованием, а затем удаляется и переименованная таблица. Следовательно, это не может повлиять на целостность структуры базы данных.

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

-- ... удаление констрейнов, индексов, триггеров, представалений и других зависимых объектов, если такие есть ...

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##old', '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
DECLARE @error int;
INSERT INTO [dbo].[Events] ([IdEvents], [Name], [Dsc], [Expires], [DateIns], [DateUpd], [DateDel])
SELECT [IdEvents], [Name], [Dsc], [Expires], [DateIns], [DateUpd], [DateDel]
	FROM [dbo].[Events##old];
SET @error = @@ERROR;
IF @error <> 0
	RAISERROR(N'Возможна потеря данных! Ошибка %d при копировании данных из старой переименованной таблицы [dbo].[Events##old] в новую.', 16, 1, @error);
GO
SET IDENTITY_INSERT [dbo].[Events] OFF;
GO
-- восстанавливаем последние значение IDENTITY
DECLARE @seed bigint;
SET @seed = IDENT_CURRENT('[dbo].[Events##old]');
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##old])
	DROP TABLE [dbo].[Events##old];
ELSE
	RAISERROR(N'Потеря данных! Невозможно скопировать строки из старой переименованной таблицы [dbo].[Events##old] в новую.', 16, 1);
GO
--
-- ... пересоздаем констрейны, индексы, триггеры, представаленя и другие зависимые объекты, если такие были ...