Порівняння і синхронізація структури таблиць баз даних 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 в даному випадку не може завдати шкоди цілісності структури БД, бо перейменована таблиця потім буде видалена.

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

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