Як змінити складання бази даних SQL Server?


16

Я намагаюся стандартизувати всі бази даних на одному зіставленні - Latin1_General_CI_AS (стандартне порівняння). У мене є деякі бази даних, які знаходяться в SQL_Latin1_General_CP1_CI_AS.

Я знаю, що я можу використовувати ALTER DATABASE для зміни зібрання бази даних, але це впливає лише на нові об'єкти. Я розумію, що єдиний спосіб змінити існуючі стовпці - це зробити ALTER COLUMN на кожному стовпчику кожної таблиці - і мені потрібно скинути і відтворити всі індекси, щоб зробити це навіть.

Я думаю, це виглядатиме приблизно так:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

і повторіть для кожного вархара, символу, тексту, nvarchar, nchar та ntext стовпця у всій базі даних. Це був би величезний сценарій SQL.

Чи є простіший спосіб зробити це, чи хтось може запропонувати спосіб автоматизувати створення сценарію SQL для цього?

Відповіді:


9

У MS KB 325335 є варіанти, як це зробити для всього db та всіх стовпців.

В основному:

  1. Таблиці баз даних сценаріїв (з новим порівнянням)
  2. Дані DTS / SSIS (перегляд порівняння)
  3. Додайте обмеження


2

На жаль, це непросте завдання в SQL Server.

Ви можете використовувати інструмент сценаріїв на зразок SQL Redgate для порівняння для існуючих об'єктів бази даних (таблиці, збережені процедури, представлення даних тощо). Якщо у вас немає ліцензії, ви можете скористатися безкоштовним пробним періодом. Після того як ви створили нову базу даних з правильним зіставленням та відновили об’єкти зі свого сценарію, ви можете запустити SSIS для передачі даних з однієї бази даних в іншу. Якщо у вас багато даних, використовуйте об'ємну вставку T-SQL.

Щоб мати правильне порівняння для майбутніх баз даних на цьому сервері, ви можете змінити порівняння за замовчуванням на сервері. Наступна стаття MSDN пояснює, що змінюється за допомогою пунктів COLLATE ALTER DATABASE та ALTER TABLE:

Налаштування та зміна зібрання баз даних (SQL Server 2008 Книги онлайн)

Ви можете змінити зіставлення будь-яких нових об'єктів, створених у базі даних користувачів, використовуючи пункт COLLATE у операторі ALTER DATABASE . Це твердження не змінює зіставлення стовпців у будь-яких існуючих визначених користувачем таблицях. Їх можна змінити, використовуючи пункт COLLATE ALTER TABLE .

Коли ви змінюєте порівняння бази даних, ви змінюєте наступне:

  • Порівняння за замовчуванням для бази даних. Це нове порівняння за замовчуванням застосовується до всіх стовпців, визначених користувачем типів даних, змінних та параметрів, створених згодом у базі даних. Він також використовується при вирішенні ідентифікаторів об'єктів, зазначених у операторах SQL, проти об'єктів, визначених у базі даних.
  • Будь-які стовпці char, varchar, text, nchar, nvarchar або ntext у системних таблицях змінюються на нове порівняння.
  • Усі існуючі параметри char, varchar, text, nchar, nvarchar або ntext та значення скалярних повернень для збережених процедур та визначених користувачем функцій змінюються на нове порівняння.
  • Типи системних типів char, varchar, text, nchar, nvarchar або ntext та всі визначені користувачем типи даних на основі цих системних типів даних змінюються на нове порівняння за замовчуванням.

1

Як правило, це не рекомендується робити на живому сервері. Востаннє, коли я це дивився, Microsoft офіційно не підтримував це. Для цього на практиці вам потрібно створити новий екземпляр з правильним зіставленням та перемістити до нього базу даних.

Відновлення БД на сервер з іншим зіставленням за замовчуванням викликає всілякі задоволення, оскільки tempdb матиме збір нового сервера, тому це також не рекомендується.



1

Ви можете використовувати перегляди Infomation_Schema, щоб створити сценарій досить легко, але я не впевнений, що це найкращий спосіб вирішити вашу проблему. Повторне створення всіх індексів на великій точці може зайняти величезну кількість часу / простору журналу тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.