Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Уникальный индекс и секционирование  [new]
partitioning12
Guest
Коллеги,

возник вопрос по секционированию, помогите пожалуйста решить.


Есть таблица позиций чека:
create table dbo.Position(
	position_id bigint IDENTITY(-9223372036854775808,1) NOT NULL,
	number nvarchar(10) not null,
	cheque_id bigint not null,
 CONSTRAINT [pk_Position] PRIMARY KEY CLUSTERED 
(
	position_id ASC
)
) on [PRIMARY]


Таблица не секционирована. По задаче у позиции не может быть двух одинаковых номеров, уникальность нужно обеспечить на уровне БД.
В этом случае все решается уникальным индексом:

CREATE UNIQUE INDEX [idx_number_cheque_id] ON dbo.Position(
	[number] ASC,
	[cheque_id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO



Все решается хорошо и здорово.

Теперь представим, что таблица та же самая, но уже секционированная по полю position_id (по первичному суррогатному ключу). Как обеспечить решение задачи в данной ситуации?
14 мар 16, 14:17    [18928277]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс и секционирование  [new]
partitioning12
Guest
Похоже нашел ответ на свой вопрос:

https://technet.microsoft.com/en-us/library/ms187526(v=sql.105).aspx

автор
When partitioning a unique index (clustered or nonclustered), the partitioning column must be chosen from among those used in the unique index key.
If it is not possible for the partitioning column to be included in the unique key, you must use a DML trigger instead to enforce uniqueness.


Очень печально
14 мар 16, 14:21    [18928319]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс и секционирование  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
partitioning12,

а в чём печаль? trigger instead of запрещён?
14 мар 16, 14:26    [18928358]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс и секционирование  [new]
partitioning12
Guest
TaPaK,

например в том, что при добавлении поля нужно лезть в триггер и добавлять его туда.
14 мар 16, 14:27    [18928371]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс и секционирование  [new]
partitioning12
Guest
TaPaK,

да и вообще печально то, что при использовании того или иного функционала есть ограничения, которые заставляют менять структуру бд.
14 мар 16, 14:29    [18928382]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс и секционирование  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
partitioning12,

Можно вместо уникального индекса сделать индексированное представление
create view dbo.vPosition_Uniqueness
with schemabinding
as
select
 number, cheque_id
from
 dbo.Position;
go

create unique clustered index UCIX_vPosition_Uniqueness__number__cheque_id on dbo.vPosition_Uniqueness (number, cheque_id);
?

Правда потеряете возможность переключать секции.
14 мар 16, 15:00    [18928685]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс и секционирование  [new]
partitioning12
Guest
invm,

Спасибо за пример и помощь.
Instead of триггер в моем случае меньшее из зол.
14 мар 16, 15:04    [18928729]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить