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

Откуда: Ростов-на-Дону
Сообщений: 344
Здравствуйте!

Есть 2 таблицы с настройками, структура по полям, по которым вопрос

client_id INT NULLABLE, 
plan_id   INT NULLABLE,
service_id INT 


Правило такое должны быть заполнены (NOT NULL) пары:
(client_id и service_id)
или
(plan_id и service_id)

Нужно добавить проверку, что пары значений (client_id и service_id) и (plan_id и service_id) уникальны.
Вставка в таблицу идет в общем через хранимые процедуры, и там вроде бы все корректно, но видимо периодически кто-то из девелоперов допускает досадную ошибку в результате в таблице имеем дубли. Хочется как то чтобы в следующий раз при допущении ошибки данные остались валидными.

Индекс так как поля nullable я так понимаю не создать, view материализованное по 2м парам делать не хочется так как в одной таблице 1,4 млн записей, в другой 2,2 жалко места. Подумали и решили, что будем это проверять в триггере, сделали триггер After insert с проверкой что если вставляется запись-дубликат будет делать RAISEERROR
RAISERROR('FAIL. This INSERT make doubles in TABLE client_settings',16,0);


Думая что будет происходить откат и данные в итоге не вставятся (во всех работающих процедурах стоит BEGIN TRAN COMMIT TRAN и опция SET_XACT_ABORT ON). Триггер срабатывает, ошибка выдается, а данные-дубликаты вставляются в таблицу.

Что не так и какие возможно лучшие способы есть реализовать эту задачу?
Спасибо.
23 авг 12, 17:54    [13056849]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на то что вставляется уникальная пара значений в триггере After insert  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Два фильтрованных уникальных индекса.

Сообщение было отредактировано: 23 авг 12, 17:55
23 авг 12, 17:55    [13056857]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на то что вставляется уникальная пара значений в триггере After insert  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Спасибо :)
23 авг 12, 17:57    [13056867]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на то что вставляется уникальная пара значений в триггере After insert  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Nimua
RAISERROR('FAIL. This INSERT make doubles in TABLE client_settings',16,0);


Думая что будет происходить откат и данные в итоге не вставятся (во всех работающих процедурах стоит BEGIN TRAN COMMIT TRAN и опция SET_XACT_ABORT ON). Триггер срабатывает, ошибка выдается, а данные-дубликаты вставляются в таблицу.

Спасибо.

Лучше не думать, а проверить.
Адрес для размышления:
http://msdn.microsoft.com/en-us/library/ms189799.aspx

Если нужен откат вставленных строк, после RAISERROR добавляем строку ROLLBACK TRANSACTION;
23 авг 12, 18:01    [13056891]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на то что вставляется уникальная пара значений в триггере After insert  [new]
aleks2
Guest
Nimua
view материализованное по 2м парам делать не хочется так как в одной таблице 1,4 млн записей, в другой 2,2 жалко места


Гавриленко Сергей Алексеевич
Два фильтрованных уникальных индекса.


Это занимает одинаковое место. Хотя индексы проще и понятнее.
24 авг 12, 07:10    [13058189]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на то что вставляется уникальная пара значений в триггере After insert  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
aleks2,

Спасибо за пояснение!
Здесь такой момент - решение с индексами подошло идеально потому что у нас уже были индексы по этим парам полей, единственное, что нужно было сделать это добавить UNIQUE и фильтр в каждый из индексов
25 авг 12, 10:13    [13063316]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на то что вставляется уникальная пара значений в триггере After insert  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Minamoto,

Спасибо! Действительно с Rollback все стало работать как и ожидали. В итоге все-таки выбрали контроль с помощью индексов.
27 авг 12, 11:03    [13067996]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить