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

Откуда:
Сообщений: 1
Всем доброго времени суток. В институте начали проходить Microsoft SQL-server. Преподаватель ушел на больничный, оставив все индивидуальное задание по написанию триггера. Так вот.

Имеется база данных. Скрин я приложил файлом. Нужно написать триггер, который пересчитывает процент ([Percent] в таблице TypeAccount) и выводит имя клиента с уже пересчитанным процентом.

У меня даже нет идей с чего начать :)

К сообщению приложен файл. Размер - 30Kb
10 ноя 17, 09:39    [20942305]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20491
cleep
У меня даже нет идей с чего начать

Во-первых, определиться, какие события должны инициировать триггер. Во-вторых, определиться с формулой/методикой расчёта. В третьих, хорошо подумать, какие возможны интерференции (включая каскадные операции), чем они аукнутся и как этих проблем избежать. Ну а потом просто закодить всё вышерасписанное.
10 ноя 17, 09:41    [20942307]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Начать с чтения про триггеры.
10 ноя 17, 09:52    [20942338]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
aleksrov
Member

Откуда:
Сообщений: 948
В четвертых, подумать как это можно сделать без тригера.
10 ноя 17, 09:52    [20942339]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
aleksrov
В четвертых, подумать как это можно сделать без тригера.

секта боязни триггеров
10 ноя 17, 09:57    [20942347]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Если препод задал именно триггеры, а скорее всего так и есть, то нечего тут думать.

Ну разве что сделать основное задание, а потом покрасоваться. Мол вон мы вычисляемых полей сделали. Или вообще, вот вам ПРЕДСТАВЛЕНИЕ как интерфейс.
10 ноя 17, 09:59    [20942366]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А еще, дорогой студиозо, обязательно прикупи" Microsoft SQL Server 20ХХ. Основы T-SQL" Ицика Бен Ганна. Это вот вообще лучшее, с чего можно начать.
10 ноя 17, 10:03    [20942376]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
cleep,

Тут подвох. Любая операция, связанная со столбцом суммы AmoutOp в таблице проводок Operation, меняет баланс клиента, но столбца Amount нет в справочнике клиентов Account, а есть только общая сумма в разрезе типов клиентов и процент.
Получается - есть 2 записи типов, Amount 50 и 50% по типу "хороший клиент" и Amount 50 и 50% по типу "плохой клиент". А теперь заводится новый клиент с типом "средненький клиентик". Далее - вбиваем новую проводку AmountOp=10 в таблице проводок Operation. Следите за руками? Теперь в таблице TypeAcount должен отработать триггер - потому что появится не только AmountOp=10 и процент 10/110, но и для 2 существующих типов вместо 50% станет 50/110, а это уже не 50%.
А теперь внимание вопрос "и выводит имя клиента с уже пересчитанным процентом" - куда выводит то?

1. Пересчитанный процент будет по ВСЕМ клиентам, если он меняется. А он меняется любой операцией изменения баланса по клиенту - потому что меняется сразу Amount по типу, а значит, меняется Percent на всех строках справочника типа. Формулировка "имя клиента с уже пересчитанным процентом" делится на "имя клиента, по которому прошла операция в Operation" или "имя каждого клиента, по которому получилось изменение процента", неявно подразумевается первый, но будь я преподавателем - я бы срезал Ваш ответ встречным вопросом, если бы захотел не принять сделанную работу.

2. Физически куда выводить? Триггер работает внутри БД, а вывод подразумевается про клиентское приложение или студию SSMS, так? Выходит, нужно в теле триггера печатать командой print "чего-то пересчитали, операция прошла по имени FIO из справочника Client для идентификатора PK_Account в справочнике Account, старый баланс типа был 0%, а теперь 10/110 в процентах"? И это куда-то получать и выводить на экран?

Ну и кстати, не забудьте, что баланс меняется не только вставкой новой проводки, но и удалением старой неверной или исправлением (update, если оно затрагивает столбец AmountOp).
В общем, преподаватель заболел и решил, что раз ему плохо (он на больничном) - то пусть и молодежи тоже будет плохо :)
10 ноя 17, 10:14    [20942416]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
cleep
В институте начали проходить Microsoft SQL-server.
У меня даже нет идей с чего начать :)

Можете начать с того, что напишите сюда ФИО преподавателя. И его email. А дальше я продолжу сам.
10 ноя 17, 10:19    [20942440]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
aleksrov
Member

Откуда:
Сообщений: 948
TaPaK
aleksrov
В четвертых, подумать как это можно сделать без тригера.

секта боязни триггеров


Ага :)
Просто я очень редко видел его к месту, я ж говорю, это как курсор, когда начинающий админ узнает что такое есть, это начинают пихать везде где только можно. Любой интсрумент имеет право на жизнь и любой пригодится в разных ситуациях.
Если студент сможет аргументировать почему здесь нужен триггер и почему от него нельзя отказаться, то я думаю препода это приятно удивит.
10 ноя 17, 10:26    [20942466]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
aleksrov
TaPaK
пропущено...

секта боязни триггеров


Ага :)
Просто я очень редко видел его к месту, я ж говорю, это как курсор, когда начинающий админ узнает что такое есть, это начинают пихать везде где только можно. Любой интсрумент имеет право на жизнь и любой пригодится в разных ситуациях.
Если студент сможет аргументировать почему здесь нужен триггер и почему от него нельзя отказаться, то я думаю препода это приятно удивит.

мои глаза открыоись, перепишем всё на хранимки
10 ноя 17, 10:28    [20942471]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
автор
мои глаза открыоись, перепишем всё на хранимки

Тут,как говориться, поздно пить Боржом когда почки уже сели. Надо было проектировать без триггеров. А переписывать по-человечески будет себе дороже.


PS
Не подумайте, что я тут в секте, но за 12+ лет в профессии я увидал ровно два кейса, когда задачу лучше всего решать триггером. Что, какбы, намекает.
10 ноя 17, 10:37    [20942499]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile
автор
мои глаза открыоись, перепишем всё на хранимки

Тут,как говориться, поздно пить Боржом когда почки уже сели. Надо было проектировать без триггеров. А переписывать по-человечески будет себе дороже.


PS
Не подумайте, что я тут в секте, но за 12+ лет в профессии я увидал ровно два кейса, когда задачу лучше всего решать триггером. Что, какбы, намекает.

это намекает только на то что вы ничего не видели
10 ноя 17, 10:40    [20942505]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
cleep,

и это еще не всё. Триггер будет на таблице проводок. Но вот незадача - тип у клиента поменяли со средненького на хороший. И теперь в таблице типов вместо 3 записей по 50, 50 и 10 будет 2 записи по 60 и 50. Percent таки пересчитать нужно. А это означает ВТОРОЙ триггер уже на клиентах. Догадываетесь про степень издевки заболевшего - в задании про триггер, а их нужно минимум два...
10 ноя 17, 10:45    [20942529]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
TaPaK, еее, пятничный триггеросрач!

Ну тогда, дорогой коллега, просвятите меня. Прям вот примеры инженерных задач, которые лучше решать триггером. Желательно с аргументами, что считать за лучше, и почему.

Опускаем очевидное логирование разных видов, и откат транзакции через райзэрор.
10 ноя 17, 10:48    [20942551]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
TaPaK
Member

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

триггерами считать математику не правильно, триггере реализуют бизнес логику.
автор
выводит имя клиента с уже пересчитанным процентом.

триггеры не предназначены для result set, хотя и могут, хотя по умолчанию и закрыли уже.
10 ноя 17, 10:51    [20942573]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP,

Конечно, будет не две записи по 60 и 50, а три, но третью с Percent 0 (потому что в примере средненьких клиентов не осталось) могут сразу из клиентского приложения подчистить за ненадобностью.
10 ноя 17, 10:53    [20942598]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile
TaPaK, еее, пятничный триггеросрач!

Ну тогда, дорогой коллега, просвятите меня. Прям вот примеры инженерных задач, которые лучше решать триггером. Желательно с аргументами, что считать за лучше, и почему.

Опускаем очевидное логирование разных видов, и откат транзакции через райзэрор.

всё описано в msdn
автор
DML triggers can be used to enforce business rules and data integrity, query other tables, and include complex Transact-SQL statements. The trigger and the statement that fires it are treated as a single transaction, which can be rolled back from within the trigger. If a severe error is detected (for example, insufficient disk space), the entire transaction automatically rolls back.
10 ноя 17, 10:54    [20942601]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
aleksrov
Member

Откуда:
Сообщений: 948
TaPaK,

Вот я вроде не сильно усколобый и не сильно начинающий (2.5 года где-то, до этого об SQL знал что он есть), поэтому да, кол-во систем которые возможно видели вы или Гавриленко мне и не снилось пока, поэтому и пишу, из всего что я видел, тригеры пихали как попало и куда попало. Поэтому если поделитель интересными случаями их применения, то буду благодарен :)
10 ноя 17, 11:26    [20942768]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
автор
доказывать узколобым начинающим

Работаешь, понимашь, больше десяти лет в топопых (по отраслям) конторах страны. Там топ1 банк, тут топ1 брокер. Весь такой синьор скуль девелопер. Людей собеседуешь, новичков туторишь. Потом заходишь, такой, на скуль ру, и тебя из Киева поясняют, что ты узколобый начинающий... Нормас, чо.
10 ноя 17, 11:39    [20942836]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
aleksrov
я думаю препода это приятно удивит.
Буду откровенным, препод обычно не является профессиональным разработчиком. Потому навороты скорее всего не оценит. Лучше делать и говорить так, как написано в конспекте.

З.Ы. Когда я в студенческие годы делал за баксы лабы и курсовики, ребятам нередко ставили двойки. Препод просто не в состоянии был въехать в высоко оптимизированный код. Потому я намеренно стал делать криво и с мелкими косяками. Сразу пошли пятёрки.

#Хэш=
10 ноя 17, 11:44    [20942861]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Cammomile
автор
доказывать узколобым начинающим

Работаешь, понимашь, больше десяти лет в топопых (по отраслям) конторах страны. Там топ1 банк, тут топ1 брокер. Весь такой синьор скуль девелопер. Людей собеседуешь, новичков туторишь. Потом заходишь, такой, на скуль ру, и тебя из Киева поясняют, что ты узколобый начинающий... Нормас, чо.


Ну справедливости ради, я бы не сказал по вашим вопросам что у вас 10+ лет в топовых конторах, вы даже классический снифинг не узнали (ваша тема) и город к квалификации специалиста не имеет никакого отношения. Я сейчас в долбанной деревне живу, где об SQL наверно слышал только мой кот, который сидит рядом и слушает мой бубнеж во время прочтения статей\литературы и т.д.
10 ноя 17, 11:47    [20942875]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
TaPaK
Member

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

я нигде и не говрю что всё что попало надо быть реалзовывать триггерами. Но если "спец" шипит что не видел и не понимает(что-то кроме логирования), то тут добавить в эту "полную" голову нечего
10 ноя 17, 11:55    [20942923]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
Cammomile
Ты, дружок, сливаешься на балабольство. Для чего могут быть использованы триггеры, я знаю с 4 курса института.
Я тебя спрашиваю за конкретные бизнес задачи, когда систему надо СПРОЕКТИРОВАТЬ на триггерах, потому, что это лучше.

Вот ты типа крутой Архитектор. Тебе заказали сделать систему с нуля, вся бизнес логика на стороне сервера.
Что именно, кроме логов и откатов транзакций ты реализуешь исключительно триггерами? Почему?

Ты там сделал заявку, что я мол пороха не нюхал. Не вопрос, я всегда открыт к общению и новым знаниям... Осталось тебе свой опыт подтвердить делом.
Например, часто для бизнес логики нужны некие данные, типа остатка на банковском счёте. Чтобы Вы не могли снять со счёта в банкомате больше, чем на нём есть. Конечно, можно эти данные каждый раз вычислять на лету, сделав функцию и даже вьюшку. А можно вычислять с помощью триггеров на этапе изменения данных, от которых этот остаток зависит. И хранить его на диске в поле таблицы. Это зависит от количества операций по изменению данных и требований к их производительности. Если остаток не требуется знать в реальном времени (например, баланс у сотового оператора, допускающего небольшой залёт в минус), то остаток можно считать с помощью отдельной фоновой задачи, запускаемой периодически.

Это пример, когда одну задачу можно решить разными способами. И конкретный способ зависит от требований к производительности и нагрузки на систему. То есть, именно на этапе проектирования принять решение сложно. Часто такие вещи делают по результатам стендовых испытаний или уже опытной эксплуатации у заказчика.

#Хэш=
10 ноя 17, 12:06    [20942977]     Ответить | Цитировать Сообщить модератору
 Re: Sql триггер для перерасчета данных  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Это всё ясно-понятно. Я задал предельно конкретный вопрос.

Для каких задач надо ПРОЕКТИРОВАТЬ ЛОГИКУ на триггерах. Мне бы конкретный пример когда писать что то на уровне Процедур плохо, а на уровне Триггеров хорошо.

Вон Тапак сделал заявку, что ему такие случаи широко известны, но он никому не расскажет...
10 ноя 17, 12:10    [20943008]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить