2014-10-01 2 views
6

Alter CollationИзменение параметров сортировки в SQL Server 2012 базы данных

мне нужно изменить параметры сортировки одного из наших баз данных на конкретном сервере из Latin1_General_CI_AS в SQL_Latin1_General_CP1_CI_AI так, что он совпадает с остальной частью наших баз данных.

Alter Collation Dialog - SQL Server 2012 R2

Проблема

Однако, когда я пытаюсь сделать это, я получаю следующее сообщение об ошибке:

ALTER DATABASE failed. The default collation of database 'XxxxxXxxxxx' cannot be set to SQL_Latin1_General_CP1_CI_AI. (Microsoft SQL Server, Error: 5075)

My Research

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

Например: Problem with database collation change (SQL Server 2008)

Очевидно, что это является важной задачей, тем более, что первичные иностранные ключевые отношения должны быть сохранены, и наша база данных достаточно велика (более десяти миллионов строк данных).

Мой вопрос

Есть ли способ, чтобы изменить параметры сортировки существующей базы данных SQL Server 2012, которая не требует экспорта и повторного импорта всех данных?

В качестве альтернативы, есть ли какой-либо инструмент или скрипт (-ы), который может автоматизировать этот процесс надежным образом?

ответ

3

Следующие работы для меня на SQL Server 2012:

ALTER DATABASE CURRENT COLLATE SQL_Latin1_General_CP1_CI_AI; 

Принятый ответ на вопрос, связанный не совсем правильно, по крайней мере, не для SQL Server 2012. Она говорит:

Ahh, this is one of the worst problems in SQL Server: you cannot change the collation once an object is created (this is true both for tables and databases...).

Но я просто смог изменить сортировку по умолчанию, и у меня есть заполненные таблицы. На странице MSDN для ALTER DATABASE состояний в разделе «Примечания», в разделе «Изменение для баз данных»:

Before you apply a different collation to a database, make sure that the following conditions are in place:

  1. You are the only one currently using the database.

  2. No schema-bound object depends on the collation of the database.

    If the following objects, which depend on the database collation, exist in the database, the ALTER DATABASE database_name COLLATE statement will fail. SQL Server will return an error message for each object blocking the ALTER action:

    • User-defined functions and views created with SCHEMABINDING.

    • Computed columns.

    • CHECK constraints.

    • Table-valued functions that return tables with character columns with collations inherited from the default database collation.

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

  • падение их
  • изменения сверка
  • , а затем повторно добавить их

BUT, В этом пункте все, что было изменено, это сортировка по умолчанию в базе данных. Учет всех существующих столбцов в пользовательских таблицах (т. Е. Несистемных таблицах) будет по-прежнему иметь исходную сортировку.Если вы хотите, чтобы существующие строковые столбцы - CHAR, VARCHAR, NCHAR, NVARCHAR и устаревшие TEXT и NTEXT - чтобы взять новый Collation, вам нужно поменять каждый из этих столбцов индивидуально. И если в этих столбцах есть какие-либо индексы, тогда эти индексы нужно будет сначала отбросить (отключить недостаточно) и снова создать после ALTER COLUMN (другие зависимости, которые предотвратили бы отказ ALTER COLUMN, чтобы получить ALTER DATABASE для работы). Приведенный ниже пример иллюстрирует это поведение:

Test Setup

USE [tempdb]; 
SET NOCOUNT ON; 

CREATE TABLE dbo.ChangeCollationParent 
(
    [ChangeCollationParentID] INT NOT NULL IDENTITY(1, 1) 
        CONSTRAINT [PK_ChangeCollationParent] PRIMARY KEY, 
    ExtendedASCIIString VARCHAR(50) COLLATE Latin1_General_CI_AS NULL, 
    UnicodeString NVARCHAR(50) COLLATE Latin1_General_CI_AS NULL 
); 

CREATE TABLE dbo.ChangeCollationChild 
(
    [ChangeCollationChildID] INT NOT NULL IDENTITY(1, 1) 
        CONSTRAINT [PK_ChangeCollationChild] PRIMARY KEY, 
    [ChangeCollationParentID] INT NULL 
        CONSTRAINT [FK_ChangeCollationChild_ChangeCollationParent] FOREIGN KEY 
         REFERENCES dbo.ChangeCollationParent([ChangeCollationParentID]), 
    ExtendedASCIIString VARCHAR(50) COLLATE Latin1_General_CI_AS NULL, 
    UnicodeString NVARCHAR(50) COLLATE Latin1_General_CI_AS NULL 
); 

INSERT INTO dbo.ChangeCollationParent ([ExtendedASCIIString], [UnicodeString]) 
VALUES ('test1' + CHAR(200), N'test1' + NCHAR(200)); 
INSERT INTO dbo.ChangeCollationParent ([ExtendedASCIIString], [UnicodeString]) 
VALUES ('test2' + CHAR(170), N'test2' + NCHAR(170)); 


INSERT INTO dbo.ChangeCollationChild 
     ([ChangeCollationParentID], [ExtendedASCIIString], [UnicodeString]) 
VALUES (1, 'testA ' + CHAR(200), N'testA ' + NCHAR(200)); 
INSERT INTO dbo.ChangeCollationChild 
     ([ChangeCollationParentID], [ExtendedASCIIString], [UnicodeString]) 
VALUES (1, 'testB ' + CHAR(170), N'testB ' + NCHAR(170)); 

SELECT * FROM dbo.ChangeCollationParent; 
SELECT * FROM dbo.ChangeCollationChild; 

Тест 1: Изменение столбца Collation без зависимостей

ALTER TABLE dbo.ChangeCollationParent 
    ALTER COLUMN [ExtendedASCIIString] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL; 
ALTER TABLE dbo.ChangeCollationParent 
    ALTER COLUMN [UnicodeString] NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL; 

ALTER TABLE dbo.ChangeCollationChild 
    ALTER COLUMN [ExtendedASCIIString] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL; 
ALTER TABLE dbo.ChangeCollationChild 
    ALTER COLUMN [UnicodeString] NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL; 

SELECT * FROM dbo.ChangeCollationParent; 
SELECT * FROM dbo.ChangeCollationChild; 

В ALTER COLUMN выше утверждения успешно завершена.

Тест 2: Изменение столбца Collation с зависимостями

-- First, create an index: 
CREATE NONCLUSTERED INDEX [IX_ChangeCollationParent_ExtendedASCIIString] 
    ON dbo.ChangeCollationParent ([ExtendedASCIIString] ASC); 

-- Next, change the Collation back to the original setting: 
ALTER TABLE dbo.ChangeCollationParent 
    ALTER COLUMN [ExtendedASCIIString] VARCHAR(50) COLLATE Latin1_General_CI_AS NULL; 

На этот раз ALTER COLUMN заявление получено следующее сообщение об ошибке:

Msg 5074, Level 16, State 1, Line 60
The index 'IX_ChangeCollationParent_ExtendedASCIIString' is dependent on column 'ExtendedASCIIString'.
Msg 4922, Level 16, State 9, Line 60
ALTER TABLE ALTER COLUMN ExtendedASCIIString failed because one or more objects access this column.

ТАКЖЕ, Обратите внимание, что сверку некоторые строковые столбцы в представлениях системного каталога с базами данных (например, sys.objects, sys.columns, sys.indexes и т. Д.) Изменится на новую сортировку. Если ваш код имеет JOINs для любого из этих строковых столбцов (т. Е. name), вы можете начать получать ошибки несоответствия Collation до тех пор, пока вы не измените Collation на столбцах объединения в ваших пользовательских таблицах.

+0

Большое спасибо за исследуемый ответ srutzky. Я попробую. –

+0

Этот метод не работает, если что-либо в базе данных использует любой из столбцов, о которых идет речь. Например, если у вас есть SP, который имеет что-то вроде «WHERE x = y», а x и y - varchars, вы не можете изменить сортировку из-за проблемы (2). Таким образом, в основном это работает для баз данных, на которые вы действительно не заботитесь, и терпит неудачу для чего-либо реального мира. –

+0

@MauryMarkowitz относительно «если у вас есть SP, который имеет что-то вроде« WHERE x = y », а x и y - varchars, вы не можете изменить сортировку из-за проблемы (2) _»: вы пробовали это и обнаружили, что это не работает, или вы собираетесь основываться на том, что говорится в документации, которую я цитировал? Потому что я пробовал это, и он действительно работает. Вы неправильно читаете точку №2. Он не имеет ничего общего с хранимыми procs, и (N) столбцы VARCHAR имеют определенную сортировку. Это строковые литералы, параметры и некоторые столбцы в таблицах системного каталога, которые затронуты, поскольку они контролируются с помощью сортировки по умолчанию db. –

Смежные вопросы