|
Триггер
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичА с какого перепугу он не должен отрабатывать? iapЕщё как! Запустите мой пример и убедитесь. Или соорудите свой для DELETE MyTable WHERE 2*2=5; Спасибо! Не разбирался еще, предполагал что For Delete будет отрабатывать только если записи были реально удалены. В триггерах всегда использовал джоины на обе таблицы (inserted, deleted) и по ним определял, реально ли запись была удалена. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 16:29 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDminvmпропущено... Даже тогда, когда проверка этой самой реальности дороже самих изменений?А Вы можете без реальных данных, статистик и тп на пальцах доказать, что проверка этой самой реальности дороже самих изменений? Вот и я не могу доказать обратное. Смысл продолжать? :)Из этого следует, что такие проверки нужно безусловно использовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 16:43 |
|
Триггер
|
|||
---|---|---|---|
#18+
invmRubinDmпропущено... А Вы можете без реальных данных, статистик и тп на пальцах доказать, что проверка этой самой реальности дороже самих изменений? Вот и я не могу доказать обратное. Смысл продолжать? :)Из этого следует, что такие проверки нужно безусловно использовать?Нет, я не утверждал, что всегда надо делать именно так. Не только Вы за здравый смысл. Но в качестве примера я счел нужным сделать именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 16:47 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDminvmпропущено... Даже тогда, когда проверка этой самой реальности дороже самих изменений?А Вы можете без реальных данных, статистик и тп на пальцах доказать, что проверка этой самой реальности дороже самих изменений? Вот и я не могу доказать обратное. Смысл продолжать? :)А вы можете привести код для случая 12739046 ? Вот тогда и доказывать будем. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 16:52 |
|
Триггер
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичRubinDmпропущено... Таблицы модифицировать надо. Но делать это надо только в тех случаях, когда это реально необходимо.С нетерпением жду пример кода, который будет определять, надо ли реально апдейтить 50 полей в таблице по 50 переменным, или вообще по временной таблице.Я не понимаю поставленную Вами задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 17:21 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmГавриленко Сергей Алексеевичпропущено... С нетерпением жду пример кода, который будет определять, надо ли реально апдейтить 50 полей в таблице по 50 переменным, или вообще по временной таблице.Я не понимаю поставленную Вами задачу.Печально. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 17:28 |
|
Триггер
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичRubinDmпропущено... Я не понимаю поставленную Вами задачу.Печально.Не то слово. Вы можете поставить задачу иначе, более конкретно? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 17:38 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmГавриленко Сергей Алексеевичпропущено... Печально.Не то слово. Вы можете поставить задачу иначе, более конкретно?Не вижу смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 17:45 |
|
Триггер
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичRubinDmпропущено...Не то слово. Вы можете поставить задачу иначе, более конкретно?Не вижу смысла.Это уже флуд, уважаемый. На том и остановимся. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 17:55 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmГавриленко Сергей Алексеевичпропущено... Не вижу смысла.Это уже флуд, уважаемый. На том и остановимся. представьте на таблице триггер after update, обновляющий вторую таблицу с такой же структурой по тем же значениям ключа. при условии что полей данных много. вы правда будете проверять "задетость" столбцов и конструировать в соответствии с этим команду update в теле триггера? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 18:10 |
|
Триггер
|
|||
---|---|---|---|
#18+
Shakillпредставьте на таблице триггер after update, обновляющий вторую таблицу с такой же структурой по тем же значениям ключа. при условии что полей данных много. вы правда будете проверять "задетость" столбцов и конструировать в соответствии с этим команду update в теле триггера? Зачем 1в1 синхронизировать таблицы с таким количеством полей? Ну да ладно. Видимо речь о задаче в стиле "history maintenance". Задачи такого рода делятся на два шаблона (с вариациями): 1) таблица с историей зеркально повторяет оригинальную таблицу. в данном случае ответ - конечно нет, в тригере я ничего не буду выдумывать, буду тупо insert'ить в хистори значения всех полей измененных записей оригинальной таблицы. 2) таблица с историей содержит колонки: ID записи в оригинальной таблице, Key - ключ измененного поля, OldVal & NewVal - старое и новое значение измененного поля соответственно. + дата изменения, identity изменения... В данном случае ответ - конечно да, я буду искать измененные поля с помощью функции update(FieldName) с тем, чтобы не делать холостые инсерты в хистори на каждое неизмененное поле. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 19:07 |
|
Триггер
|
|||
---|---|---|---|
#18+
Наблюдается массивная перебежка стаи гуру. Все растоптаны. iapА в общем случае большинство клиентов не заморачиваются определением того, какие поля им надо перечислить в SET, а какие нет. Чаще всего перечисляются все, просто некоторые остаются с теми же значениями. Факт наличия поля в списке SET сам по себе ни о чём не говорит.Ну можно и поспорить. Зависит от клиента. Если мне не изменяет память Entity Framework кажись "оптимизит" в зависимости от логики. Про частные случаи можно и не говорить. iapПриведёт к удивительным результатам в MERGE! Я вот именно поэтому потихоньку меняю проверку @@ROWCOUNT на EXISTSАга, значит вы активно юзаете MERGE (иначе никакого профита в переписывании нет). Но то что вы это упомянули - очень правильно. Гавриленко Сергей АлексеевичС нетерпением жду пример кода, который будет определять, надо ли реально апдейтить 50 полей в таблице по 50 переменным, или вообще по временной таблице.Это попытка доказать несостоятельность подхода в общем случае, на основании частного? Хомо сапиенс отличается от машины тем, что иногда делает ошибки когда знает что они глупые. GloryА что виртуальные таблицы уже готовые лежат в памяти как только триггер сработал ? По сравнению с доступом к системной функции @@ROWCOUNT.С 2005 кое-что поменялось (RowVersioning). Хрен его знает стало лучше или нет. Во всяком случае теперь подымает не из логов (если данных жуть). А tempdb вынужденно ускоряется. А с другой стороны нужна любая строка, не важно первая или нет (любая в памяти) - хотя неизвестны доступные стратегии доступа для оных виртуальных таблиц. PS: Эх ... <мечтает о декларативных триггерах> ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2012, 23:00 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmShakillпредставьте на таблице триггер after update, обновляющий вторую таблицу с такой же структурой по тем же значениям ключа. при условии что полей данных много. вы правда будете проверять "задетость" столбцов и конструировать в соответствии с этим команду update в теле триггера? Зачем 1в1 синхронизировать таблицы с таким количеством полей? Ну да ладно. Видимо речь о задаче в стиле "history maintenance". Задачи такого рода делятся на два шаблона (с вариациями): 1) таблица с историей зеркально повторяет оригинальную таблицу. в данном случае ответ - конечно нет, в тригере я ничего не буду выдумывать, буду тупо insert'ить в хистори значения всех полей измененных записей оригинальной таблицы. 2) таблица с историей содержит колонки: ID записи в оригинальной таблице, Key - ключ измененного поля, OldVal & NewVal - старое и новое значение измененного поля соответственно. + дата изменения, identity изменения... В данном случае ответ - конечно да, я буду искать измененные поля с помощью функции update(FieldName) с тем, чтобы не делать холостые инсерты в хистори на каждое неизмененное поле. гораздо проще и логичнее во втором варианте воспользоваться UNPIVOT с фильтром на несовпадение значений. 50 if update() в триггере - неэстетично ИМХО ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2012, 09:03 |
|
Триггер
|
|||
---|---|---|---|
#18+
RubinDmalexeyvg... В данном случае защита уже есть, её делать не нужно - защитой будет проверка IF UPDATE().и её рекомендовали убрать :)Чтож, кто то рекомендовал, но можно и оставить, я же писал именно про такой вариант. Зависит от конкретного случая - часто ли будут (и будут ли вообще) апдэйты других полей по отдельности. iapRubinDmпропущено... и её рекомендовали убрать :)Разумеется. А роль этой защиты может играть проверка различий значений полей в inserted и deleted в кляузе WHERE, например.Нет, защиты тогда не будет - независимо от проверки различий значений полей в inserted и deleted в кляузе WHERE, команда UPDATE сработает (на нулевое количество записей) и триггер запустится ещё раз (и так бесконечно, то есть 32 раза до появления ошибки). RubinDmalexeyvgпропущено... Это всего лишь в 2 раза увеличивает время выполнения триггера, если записи обновляются, и не влияет на скорость, если записей нет.Растолкуйте, каким именно образом данный способ увеличивает время выполнения тригера в 2 раза?Ну как, 2 запроса вместо одного. Да, наверное, не в 2 раза, так как update тяжелее чем select, но я уж не буду точен до наносекунд :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2012, 10:37 |
|
Триггер
|
|||
---|---|---|---|
#18+
alexeyvgНет, защиты тогда не будет - независимо от проверки различий значений полей в inserted и deleted в кляузе WHERE, команда UPDATE сработает (на нулевое количество записей) и триггер запустится ещё раз (и так бесконечно, то есть 32 раза до появления ошибки).Ну, 32 - это не "бесконечно" Дык ведь если в начале триггера есть проверка типа IF EXISTS(SELECT * FROM deleted), то никакого зацикливания не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2012, 10:53 |
|
|
start [/forum/topic.php?fid=46&msg=37845812&tid=1712099]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
148ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 260ms |
0 / 0 |