Это мой стол:Создать уникальное ограничение изначально отключена
CREATE TABLE [dbo].[TestTable]
(
[Name1] varchar(50) COLLATE French_CI_AS NOT NULL,
[Name2] varchar(255) COLLATE French_CI_AS NULL,
CONSTRAINT [TestTable_uniqueName1] UNIQUE ([Name1]),
CONSTRAINT [TestTable_uniqueName1Name2] UNIQUE ([Name1], [Name2])
)
ALTER TABLE [dbo].[TestTable]
ADD CONSTRAINT [TestTable_uniqueName1]
UNIQUE NONCLUSTERED ([Name1])
ALTER TABLE [dbo].[TestTable]
ADD CONSTRAINT [TestTable_uniqueName1Name2]
UNIQUE NONCLUSTERED ([Name1], [Name2])
GO
ALTER INDEX [TestTable_uniqueName1]
ON [dbo].[TestTable]
DISABLE
GO
Моя идея заключается в том, чтобы включить/выключить один или другой уникальный contraint в зависимости от клиента приложения. Таким образом, я могу поймать заброшенное исключение в моем коде C# и отобразить конкретное сообщение об ошибке в GUI.
Теперь моя проблема заключается в изменении параметров сортировки столбцов Name1
& Name2
, мне нужно, чтобы сделать их случай чувствительный (French_CS_AS
). Чтобы изменить эти поля, мне нужно отбросить два ограничения и воссоздать их. Согласно объясненной схеме, я не могу создать включенное ограничение, а затем отключить его, потому что некоторые клиенты имеют дубликаты ключей для одного или другого ограничения.
Для моего сценария обновления, моя идея номер 1 был
- Сохранить имя разрешенных ограничений в таблице темпа
- падения ограничений
- Alter колонны
- Создание ИНВАЛИДЫ уникальных ограничений
- Включить определенные ограничения в соответствии с сохраненными значениями в точках 1.
Моя проблема в пункте 4. Я не могу найти, как создать отключенное уникальное ограничение с помощью инструкции ALTER TABLE
. Можно ли создать его непосредственно в таблице sys.indexes
?
Моя идея номер 2 был
- Rename TestTable в TestTableCopy
- Recreate TESTTABLE с новыми полями сортировки, а в противном случае та же схемы (индексы, FK, триггеры, ...)
- Отключить specifical уникальных контрсилами в TestTable
- Перенос данных из TestTableCopy в TESTTABLE
- падения TestTableCopy
Таким образом, я боюсь потерять некоторые ссылки с другими таблицами/зависимостями, потому что это центральная таблица в моей базе данных.
Есть ли другой способ достижения моей цели?
При необходимости я могу использовать уникальные индексы вместо уникальных ограничений.
Почему вы не можете забыть об ограничении Unique и проверить себя и поймать исключение при добавлении записи в таблицу? – CiucaS
Поскольку записи можно вставлять разными способами (с t-sql, из моего приложения C#, ...). Я хочу, чтобы база данных проверяла мои данные. – stephanejulien
создайте хранимую процедуру для вставки записей в таблицу, вы можете использовать ее для всех типов вставок, которые вам нужны. В хранимой процедуре проверьте ограничение, основанное на том, что вам нужно. Так бы я сделал это. Изменение таблицы не является хорошей практикой. – CiucaS