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

Откуда: Москва
Сообщений: 189
Добрый день.
Есть таблица Invoices (счета) и соответственно есть InvoicesDetailes (позиции товаров в счете).
В каждой строке InvoicesDetailes есть куча правил на Update, которые приходится проверять триггерами, например,
1. QTY > 0
2. QTY_Ready >= 0 (собрано или уже готово комплектов на складе)
3. QTY >= QTY_Ready
4. Д.б. QTY_Ready = 0 если IsComplect=0 (IsComplect - bit поле, говорит о том, что д.б. сборка ... на складе)
5. Если IsComplect=1, то
6. и т.д. много всего.

Т.е. простая валидность данных в одной строке и одной и таблице по данным разных полей.
--
Вопрос: проверять всё триггерами или есть альтернатива?
--
Правильно ли будет создать поле ValidReq (Computed Column Sp.), написать функцию InvoicesDetailes_ValidReq() для него. В этой функции делать все проверки, а триггер смотрит только на ValidReq = True ?
...
26 янв 18, 12:43    [21141358]     Ответить | Цитировать Сообщить модератору
 Re: Валидность данных в одной строке и одной таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Триггеры или CONSTRAINT <ИмяКонстрейнта> CHECK(...).
26 янв 18, 12:49    [21141393]     Ответить | Цитировать Сообщить модератору
 Re: Валидность данных в одной строке и одной таблице.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
LightN
Т.е. простая валидность данных в одной строке и одной и таблице по данным разных полей.
--
Вопрос: проверять всё триггерами или есть альтернатива?
--
Правильно ли будет создать поле ValidReq (Computed Column Sp.), написать функцию InvoicesDetailes_ValidReq() для него. В этой функции делать все проверки, а триггер смотрит только на ValidReq = True ?
Ио есть проверка в пределах одной строки одной таблицы? Тогда CHECK CONSTRAINT, как уже посоветовали.
LightN
Правильно ли будет создать поле ValidReq (Computed Column Sp.), написать функцию InvoicesDetailes_ValidReq() для него. В этой функции делать все проверки, а триггер смотрит только на ValidReq = True ?
Если уж писать функцию, то можно вставить её тоже в чек-констрейн, если триггер не нужен для других целей. Если нужен, то лучше в него, что бы не размазывать логику по куче мест.
26 янв 18, 14:03    [21141712]     Ответить | Цитировать Сообщить модератору
 Re: Валидность данных в одной строке и одной таблице.  [new]
LightN
Member

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

Это Да! Но ...
У CHECK CONSTRAINT есть минус (или я просто не в курсе) - клиенту с ошибкой ничего вразумительного не передается, как например,
RAISERROR ('Нельзя собрать комплектов больше чем в позиции счета!', 16, 1)


О, пока писал, сам придумал:
1-н TRIGGER, 1-о УСЛОВИЕ, 1-н ROLLBACK TRAN,
а на RAISERROR просто сделать CASE и через него передавать клиенту сообщение, в зависимости от того как сработал ROLLBACK TRAN.

Спасибо за ответ.
26 янв 18, 14:54    [21141980]     Ответить | Цитировать Сообщить модератору
 Re: Валидность данных в одной строке и одной таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
LightN
alexeyvg,

Это Да! Но ...
У CHECK CONSTRAINT есть минус (или я просто не в курсе) - клиенту с ошибкой ничего вразумительного не передается, как например,
RAISERROR ('Нельзя собрать комплектов больше чем в позиции счета!', 16, 1)



О, пока писал, сам придумал:
1-н TRIGGER, 1-о УСЛОВИЕ, 1-н ROLLBACK TRAN,
а на RAISERROR просто сделать CASE и через него передавать клиенту сообщение, в зависимости от того как сработал ROLLBACK TRAN.

Спасибо за ответ.
CONSTRAINT можно назвать [Нельзя собрать комплектов больше чем в позиции счета!].
А имя констрейнта упоминается в сообщении сервера.
Кроме того, имя (любое) констрейнта можно проверять на клиенте
и формировать там соответсвующий текст сообщения.
26 янв 18, 14:57    [21141997]     Ответить | Цитировать Сообщить модератору
 Re: Валидность данных в одной строке и одной таблице.  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
iap
CONSTRAINT можно назвать [Нельзя собрать комплектов больше чем в позиции счета!].
А имя констрейнта упоминается в сообщении сервера.
Кроме того, имя (любое) констрейнта можно проверять на клиенте
и формировать там соответсвующий текст сообщения.
CONSTRAINT можно назвать [Нельзя собрать комплектов больше чем в позиции счета!].
Это здорово! :)
26 янв 18, 15:36    [21142175]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить