|
Триггер
|
|||
---|---|---|---|
#18+
Здравствуйте! Сегодня впервые столкнулся с SQL. Задача такая(на пальцах): есть таблица ("MyTable"). В ней 2 поля: Field1 и Field2. так вот, необходимо при изменении, если поле Field1 == null, то и Field2 тоже обнулить. Как я понял, делается это с помощью триггера. Написал что-то типа: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
не обнуляет. Почему то еще есть сомнения, что зациклится такое обновление, ведь всегда будет вызываться UPDATE ) Подскажите пожалуйста, как правильно? Времени читать учебники просто нет, так как это разовая задачка. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 10:30 |
|
Триггер
|
|||
---|---|---|---|
#18+
Sky Dragon...не обнуляет...Не удивительно... Триггер написан из предположения, что он вызывается для каждой измененной строки. Это не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 10:36 |
|
Триггер
|
|||
---|---|---|---|
#18+
tpg, подскажите пожалуйста тогда, как сделать, чтобы было "так" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 10:40 |
|
Триггер
|
|||
---|---|---|---|
#18+
Sky Dragontpg, подскажите пожалуйста тогда, как сделать, чтобы было "так" :)1. Сравнивать поля/переменные с NULL операторами =,<>,<,> и т.п. нельзя! 2. Старайтесь не использовать скалярные переменные в триггерах. 3. Используйте псевдотаблицы deleted и inserted ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 10:44 |
|
Триггер
|
|||
---|---|---|---|
#18+
4. За UPDATE без WHERE надо расстреливать! (За редким исключением) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 10:46 |
|
Триггер
|
|||
---|---|---|---|
#18+
... и ничего не сказано о наличии ПК или ещё какого уникального столбца. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 10:47 |
|
Триггер
|
|||
---|---|---|---|
#18+
iap4. За UPDATE без WHERE надо расстреливать! (За редким исключением)WHERE или INNER JOIN или CROSS APPLY, если точнее ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 10:48 |
|
Триггер
|
|||
---|---|---|---|
#18+
iap4. За UPDATE без WHERE надо расстреливать! (За редким исключением) всех не перестреляешь! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 13:18 |
|
Триггер
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
зы: не проверял (ибо не на чем) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 13:51 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDm, применение функции UPDATE() - абсолютно бессмысленно ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 16:20 |
|
Триггер
|
|||
---|---|---|---|
#18+
Да и 2 раза выполнять: Код: sql 1. 2. 3. 4. 5.
думаю тоже ни к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 17:59 |
|
Триггер
|
|||
---|---|---|---|
#18+
Xordal, В общем-то, даже и один раз ни к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 18:21 |
|
Триггер
|
|||
---|---|---|---|
#18+
iapRubinDm, применение функции UPDATE() - абсолютно бессмысленноНе могли бы Вы аргументировать Ваш комент? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 19:09 |
|
Триггер
|
|||
---|---|---|---|
#18+
XordalДа и 2 раза выполнять: Код: sql 1. 2. 3. 4. 5.
думаю тоже ни к чему.И Вы... не могли бы Вы аргументировать Ваш комент? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 19:10 |
|
Триггер
|
|||
---|---|---|---|
#18+
invmXordal, В общем-то, даже и один раз ни к чему.И Вы... не могли бы Вы аргументировать Ваш комент? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 19:10 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmiapRubinDm, применение функции UPDATE() - абсолютно бессмысленноНе могли бы Вы аргументировать Ваш комент?А можно сначала услышать Ваш комментарий по этому поводу? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 20:03 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDminvmXordal, В общем-то, даже и один раз ни к чему.И Вы... не могли бы Вы аргументировать Ваш комент? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 20:26 |
|
Триггер
|
|||
---|---|---|---|
#18+
iapRubinDmпропущено...Не могли бы Вы аргументировать Ваш комент?А можно сначала услышать Ваш комментарий по этому поводу?Можно. Я всегда рад помочь незрячим и слабовидящим: Код: sql 1. 2. 3.
Теперь не могли бы Вы аргументировать Ваш комент? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 21:31 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmiapпропущено... А можно сначала услышать Ваш комментарий по этому поводу?Можно. Я всегда рад помочь незрячим и слабовидящим: Код: sql 1. 2. 3.
Теперь не могли бы Вы аргументировать Ваш комент?"Задел поле" - это как понимать? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 21:38 |
|
Триггер
|
|||
---|---|---|---|
#18+
iapRubinDmпропущено... Можно. Я всегда рад помочь незрячим и слабовидящим: Код: sql 1. 2. 3.
Теперь не могли бы Вы аргументировать Ваш комент?"Задел поле" - это как понимать? 1) Этот запрос задевает (меняет) значение поля Field1 и не задевает (не меняет) значение поля Field2. Код: sql 1.
2) Этот запрос задевает (меняет) значение поля Field2 и не задевает (не меняет) значение поля Field1. Код: sql 1.
3) Этот запрос задевает (меняет) значения обоих полей. Код: sql 1.
По условиям поставленной автором топика задачи интерес представляют только те случаи, в которых значение поля Field1 может быть изменено (примеры 1 и 3). В противном случае (пример 2) актуализация поля Field2 не требуется, т.к. Field1 не меняется и ловить там нечего в принципе. Так я увижу Ваши аргументы или забудем об этом? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2012, 21:59 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmXordalДа и 2 раза выполнять: Код: sql 1. 2. 3. 4. 5.
думаю тоже ни к чему.И Вы... не могли бы Вы аргументировать Ваш комент? Ну это условие как минимум один раз будет проверяться, а в случае если есть что апдейтить, то даже 2 раза. Зачем серверу лишнюю работу давать? И, как отметил invm, в update ... set ... подзапрос не нужен, можно сразу джойниться на таблицы inserted и deleted ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 09:44 |
|
Триггер
|
|||
---|---|---|---|
#18+
2 RubinDm Код: sql 1.
это полезный стейтмент, позволит уменьшить нагрузку на сервер Код: sql 1.
не нужно, обновление и так не будет потреблять ресурсов, если в inserted ничего нет. Код: sql 1. 2.
не нужно, запрос в update сделает то же самое. А из обновления можно убрать лишний джойн: Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 09:52 |
|
Триггер
|
|||
---|---|---|---|
#18+
Ого, сколько обсуждений вызвал такой маленький вопрос) Из одних только комментариев уже можно выучить синтаксис SQL ) Всем спасибо, что откликнулись ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 10:03 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmiapпропущено... "Задел поле" - это как понимать? 1) Этот запрос задевает (меняет) значение поля Field1 и не задевает (не меняет) значение поля Field2. Код: sql 1.
2) Этот запрос задевает (меняет) значение поля Field2 и не задевает (не меняет) значение поля Field1. Код: sql 1.
3) Этот запрос задевает (меняет) значения обоих полей. Код: sql 1.
По условиям поставленной автором топика задачи интерес представляют только те случаи, в которых значение поля Field1 может быть изменено (примеры 1 и 3). В противном случае (пример 2) актуализация поля Field2 не требуется, т.к. Field1 не меняется и ловить там нечего в принципе. Так я увижу Ваши аргументы или забудем об этом?Кто кого "задевает" в этом примере: Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 12:39 |
|
Триггер
|
|||
---|---|---|---|
#18+
iapКто кого "задевает" в этом примере: Код: sql 1.
?Задевает поля инструкция, в данном случае это update , который задевает два поля: Field1 и Field2. Тот факт, что значения полей фактически не должны изменится, вовсе не означает, что сервер не должен выполнять инструкцию update. Сервер понимает, что могут быть тригеры, которые также могут влиять на результат выполнения инструкции. Возможно, что сервер понимает еще много разного, о чем мы даже не догадываемся. При этом полей в таблице иногда бывает много, но не всегда все из них подвергаются воздействиям инструкции update. И в тригерах, как правило, надо отлавливать изменение только конкретного набора полей, как в случае задачи поставленной автором топика. Вызов функции update(Field1) отвечает на вопрос, было ли упомянуто поле Field1 в инструкции update в части set. Если не было, но нет никакой необходимости в актуализации Field2. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 12:53 |
|
|
start [/forum/topic.php?fid=46&startmsg=37842272&tid=1712099]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 129ms |
0 / 0 |