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

Изменить Параметры Сортировки

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

Alter Collation Dialog - SQL Server 2012 R2

Проблема

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

не удалось изменить базу данных. Параметры сортировки базы данных "XxxxxXxxxxx" по умолчанию не могут быть установлены в SQL_Latin1_General_CP1_CI_AI. (Microsoft SQL Server, ошибка: 5075)

Мои Исследования

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

например: проблема с изменением параметров сортировки базы данных (SQL Server 2008)

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

У Меня Вопрос

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

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

1 ответов


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

ALTER DATABASE CURRENT COLLATE SQL_Latin1_General_CP1_CI_AI;

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

Ahh, это одна из худших проблем в SQL Server: вы не можете изменить параметры сортировки после создания объекта (это верно как для таблиц, так и для баз данных...).

но я только что смог изменить параметры сортировки по умолчанию, и у меня есть таблицы, которые заселенный. Страница MSDN для ИЗМЕНИТЬ БАЗУ ДАННЫХ в графе "Примечания" в разделе "Изменение параметров сортировки базы данных":

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

  1. вы единственный, кто в настоящее время использует базу данных.

  2. объект, привязанный к схеме, не зависит от параметров сортировки базы данных.

    если следующие объекты, которые зависят от параметров сортировки базы данных, существуют в базе данных ALTER DATABASE имя_базы_данных инструкция COLLATE завершится ошибкой. SQL Server вернет сообщение об ошибке для каждого объекта, блокирующего действие ALTER:

    • пользовательские функции и представления, созданные с помощью SCHEMABINDING.

    • вычисляемые столбцы.

    • проверить ограничения.

    • табличные функции, возвращающие таблицы с символьными столбцами с параметрами сортировки, унаследованными от параметров сортировки базы данных по умолчанию.

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

  • падение их
  • изменить параметры сортировки
  • а затем повторно добавить их!--40-->

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

Настройка Тест

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: Изменение параметров сортировки столбцов без зависимостей

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: Изменение параметров сортировки столбцов с зависимостями

-- 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, Уровень 16, Состояние 1, Строка 60
Индекс "IX_ChangeCollationParent_Extendedasciistring" зависит от столбца "ExtendedASCIIString".
Msg 4922, Уровень 16, Состояние 9, Строка 60
ALTER ТАБЛИЦА ALTER СТОЛБЕЦ ExtendedASCIIString не удалось, так как один или несколько объектов обращаются к этому столбцу.

и имейте в виду, что параметры сортировки некоторых столбцов строк в представлениях системного каталога с областью базы данных (например,sys.objects, sys.columns, sys.indexes и т. д.) изменится на новую сортировку. Если ваш код присоединяется к любому из этих столбцов строк (т. е. name), то вы можете начать получать ошибки несоответствия сортировки, пока вы не измените параметры сортировки на присоединяющихся Столбцах в вашем пользователе таблицы.

обновление:

если изменение параметров сортировки для всего экземпляра является желанием или опцией, то существует более простой метод, который обходит все эти ограничения. Он недокументирован и, следовательно, не поддерживается (поэтому, если он не работает, Microsoft не поможет). Однако он изменяет параметры сортировки на всех уровнях: экземпляр, все базы данных и все строковые столбцы во всех пользовательских таблицах. Он делает это и избегает всех типичных ограничений, просто обновляя метаданные таблиц и т. д., Чтобы иметь новые параметры сортировки. Затем он отбрасывает и воссоздает все индексы, имеющие строковые столбцы. Есть также несколько нюансов этого метода, которые могут оказать влияние, но исправимы. Этот метод является переключатель sqlservr.exe. Я задокументировал все поведение, включая перечисление всех потенциально затронутых областей, выполнив такое широкое изменение сортировки, в следующем посте:

изменение Сопоставление экземпляра, баз данных и всех столбцов во всех пользовательских базах данных: что может пойти не так?