Порівняння і синхронізація структури таблиць баз даних 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.

яке слід ігнорувати. Всі дочірні об'єкти і об'єкти, що посилаються на стару таблицю, видаляються перед перейменуванням, а потім видаляється і стара перейменована таблиця. Отже, це не може вплинути на цілісність структури бази даних.

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

-- ... видалення констрейнів, індексів, тригерів, views та інших залежних об'єктів, якщо такі є ...

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
--
-- ... перестворюємо констрейни, індекси, тригери, views та інші залежні об'єкти, якщо такі були ...