Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Валидность данных в одной строке и одной таблице. / 6 сообщений из 6, страница 1 из 1
26.01.2018, 12:43
    #39591562
LightN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидность данных в одной строке и одной таблице.
Добрый день.
Есть таблица 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 ?
...
...
Рейтинг: 0 / 0
26.01.2018, 12:49
    #39591569
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидность данных в одной строке и одной таблице.
Триггеры или CONSTRAINT <ИмяКонстрейнта> CHECK(...).
...
Рейтинг: 0 / 0
26.01.2018, 14:03
    #39591655
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидность данных в одной строке и одной таблице.
LightNТ.е. простая валидность данных в одной строке и одной и таблице по данным разных полей.
--
Вопрос: проверять всё триггерами или есть альтернатива?
--
Правильно ли будет создать поле ValidReq (Computed Column Sp.), написать функцию InvoicesDetailes_ValidReq() для него. В этой функции делать все проверки, а триггер смотрит только на ValidReq = True ?Ио есть проверка в пределах одной строки одной таблицы? Тогда CHECK CONSTRAINT, как уже посоветовали.
LightNПравильно ли будет создать поле ValidReq (Computed Column Sp.), написать функцию InvoicesDetailes_ValidReq() для него. В этой функции делать все проверки, а триггер смотрит только на ValidReq = True ?Если уж писать функцию, то можно вставить её тоже в чек-констрейн, если триггер не нужен для других целей. Если нужен, то лучше в него, что бы не размазывать логику по куче мест.
...
Рейтинг: 0 / 0
26.01.2018, 14:54
    #39591726
LightN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидность данных в одной строке и одной таблице.
alexeyvg,

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



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

Спасибо за ответ.
...
Рейтинг: 0 / 0
26.01.2018, 14:57
    #39591730
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидность данных в одной строке и одной таблице.
LightNalexeyvg,

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




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

Спасибо за ответ.CONSTRAINT можно назвать [Нельзя собрать комплектов больше чем в позиции счета!].
А имя констрейнта упоминается в сообщении сервера.
Кроме того, имя (любое) констрейнта можно проверять на клиенте
и формировать там соответсвующий текст сообщения.
...
Рейтинг: 0 / 0
26.01.2018, 15:36
    #39591756
LightN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидность данных в одной строке и одной таблице.
iapCONSTRAINT можно назвать [Нельзя собрать комплектов больше чем в позиции счета!].
А имя констрейнта упоминается в сообщении сервера.
Кроме того, имя (любое) констрейнта можно проверять на клиенте
и формировать там соответсвующий текст сообщения. CONSTRAINT можно назвать [Нельзя собрать комплектов больше чем в позиции счета!].
Это здорово! :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Валидность данных в одной строке и одной таблице. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]