|
|
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги Подскажите, нет ли системной функции для определения в триггере Update, какое поле обновлено. Спасибо. Артур ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2009, 07:51 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
ARTURVУважаемые коллеги Подскажите, нет ли системной функции для определения в триггере Update, какое поле обновлено. Спасибо. Артур В триггере пишите: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2009, 09:33 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Но мне хотелось бы не указывать конкретнное поле а получить имя поля, которое обновляется, а лучше список, если обновляется несколько полей. Хотелось бы вести свой лог изменений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2009, 10:10 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
ARTURVСпасибо за ответ. Но мне хотелось бы не указывать конкретнное поле а получить имя поля, которое обновляется, а лучше список, если обновляется несколько полей. Хотелось бы вести свой лог изменений Не стоит аудит вешать на триггера - называется прощай производительность и здравствуй тормоза. Быстрый способ обеспечить простейший аудит - на каждую таблицу сделать 2 колонки с DEFAULT значениями "Last User" и "TimeStamp" - в них ASA автоматически будет фиксировать логин пользователя и время во время добавления или изменения записи. Если же хотите заморочиться серьезнее, то значит нужно выносить механизм аудита на клиентскую часть или же делать сохранение данных клиентской части через ХП, в которых анализировать изменения и фиксировать их в логе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2009, 16:31 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
Смотря для каких целей вы хотите это делать. Если для фиксирования изменений (например для рукописной репликации) то Вариант 1: исходные данные: таблица t_bill (id_bill integer, dt date, doc_no varchar(30)) - создаете точную копию этой таблицы с префиксом ... пусть будет "repl" и каждое поле то же дублируете, префикс "о_" - старое значение, "n_" - новое значение repl_t_bill (id_repl, repl_date, repl_user, repl_result, repl_more ,o_id_bill integer, n_ id_bill integer, o_dt date, n_dt date, o_doc_no varchar(30), n_doc_no varchar(30)) (поля repl_date, repl_user, repl_result, repl_more - указывают кто вставил-изменил-удалил, удачно или нет отработала самописная репликация, режим (insert-update-delete) ) - вешаете тригера на update, insert, delete и записываете в эту таблицу старые и новые сначения полей - анализируете потом или обрабатываете или ... (P.S. именно такой вариант репликации у нас отработал около 5 лет на оракле ... давно это было) вариант 2: - строите курсор по системной таблице Код: plaintext 1. 2. в которой содержатся поля этой таблицы и в цикле проверяете каждое поле (правда SQL запрос вам придется формировать вручную) - если изменилось то это поле пишете во временную таблицу (или в переменную через запятую или ...) -используете полученный результат на свое усмотрение Но как правильно заметил уважаемый ASCRUS автор"называется прощай производительность и здравствуй тормоза" Вы бы описали более точно задачу ... может сообща и найдем более приемлемое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2009, 18:00 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
ASCRUSARTURVСпасибо за ответ. Но мне хотелось бы не указывать конкретнное поле а получить имя поля, которое обновляется, а лучше список, если обновляется несколько полей. Хотелось бы вести свой лог изменений Не стоит аудит вешать на триггера - называется прощай производительность и здравствуй тормоза. Быстрый способ обеспечить простейший аудит - на каждую таблицу сделать 2 колонки с DEFAULT значениями "Last User" и "TimeStamp" - в них ASA автоматически будет фиксировать логин пользователя и время во время добавления или изменения записи. Если же хотите заморочиться серьезнее, то значит нужно выносить механизм аудита на клиентскую часть или же делать сохранение данных клиентской части через ХП, в которых анализировать изменения и фиксировать их в логе. Спасибо за ответы Очевидно буду переносить ведение лога на клиента Как рекомендует ASCRUS использовать "Last User" и "TimeStamp" - я раньше так и делал, но в данном случае мне необходимо фиксировать все изменения во времени и по пользователям. БД будет небольшая и тем ввода низкий. Я всегда старался обработку максимально переносить в сервер, а клиент в основном это "отображаловка". Возможно пойду по пути просто Insert - ов вместо Update и Delete, но это приводит к избыточности данных или, как советует ASCRUS, писать все в клиентской части. Еще раз спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2009, 22:09 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
ARTURVВозможно пойду по пути просто Insert - ов вместо Update и Delete, но это приводит к избыточности данныхНикакой избыточности. Наоборот очень удобно для всех (ну или почти всех) таблиц делать дополнительные поля Start/End_Date и фиксировать в них период активности данной строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2009, 23:16 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
А я просто тупо пишу новые данные в таблицы_log, где есть дополнительные поля с current user, current date, current time и имя машины, с которой все делается, ну и триггер на ночь, который удаляет данные 2-х месячной давности... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2009, 09:05 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
ASCRUSНе стоит аудит вешать на триггера - называется прощай производительность и здравствуй тормоза. Не согласен в корне. Я бы воздержался от такой категоричности, ведь все зависит от реализации. А иначе бы любые триггеры были бы признаны злом, однозначно вызывающим ступор сервера. Чем отличается аудит-триггер от триггера обновляющего агрегированный свод данных? Да ни чем! Более того, аудит-триггер порождает гарантированное, предсказуемое и ограниченное множество действий (вставка одной записи в аудит-таблицу), в отличии от триггеров других типов (возможные операции по дополнительной выборке, вставке/обновлению/удалению записей в других таблицах). Так что, если производительность падает, то это еще не повод переносить на клиента ведение аудита. Особенно, когда вся бизнес-логика реализована на серваке. А в некоторых случаях, как доступ по HTTP, это и невозможно в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 15:59 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
iLLerТак что, если производительность падает, то это еще не повод переносить на клиента ведение аудита. Особенно, когда вся бизнес-логика реализована на серваке. А в некоторых случаях, как доступ по HTTP, это и невозможно в принципе. Никто не мешает вынести запись данных в таблицы через ХП или в логический слой view + instead of триггера, в которых и будет писаться аудит. Это с одной стороны сохранит бизнес логику на сервере, с другой не будет тормозить массовые операции над таблицами (тем более что там аудит вряд ли будет нужен в виде фиксации каждой записи, измененной пользователем). Решений много, не спорю - но была поставлена общая задача - аудит с анализом изменения каждого поля записи, в этом случае я считаю вешать аудит на триггеры злом ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 16:31 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
ASCRUSНикто не мешает вынести запись данных в таблицы через ХП или в логический слой view + instead of триггера, в которых и будет писаться аудит. Чем вызов ХП с двумя инсертами (основной + аудит) отличается от основного инсерта + инсерта в аудит-триггере? Ничем. P.S.: А логировать массовые изменения, как ни крути, придется с двойным увеличением количества операций. Хоть из ХП, хоть из клиента... Триггер есть не только row, но и statment, который дернется один раз на обновлении хоть миллиона записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 16:37 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
А анализ изменений - это вообще муха на луне. Процессору проще сделать миллион сравнений, чем тыщу чтений из памяти или одно чтение с диска. Так что на if, и прочие операции можно не обращать внимания. Профилировщик подтвердит мои слова, благо в 9-ке он есть. А особенно если использовать нормальные серверные платформы, то данные зачастую оказываются не только в SQL кэше, но и в кэше процессорном. АСА хорошо оптимизирована в этом плане и время выполнения операций/запросов/процедур в миллисекундах доходит до фактического нуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2009, 16:49 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
iLLerА анализ изменений - это вообще муха на луне. Процессору проще сделать миллион сравнений, чем тыщу чтений из памяти или одно чтение с диска. Так что на if, и прочие операции можно не обращать внимания. Профилировщик подтвердит мои слова, благо в 9-ке он есть. А особенно если использовать нормальные серверные платформы, то данные зачастую оказываются не только в SQL кэше, но и в кэше процессорном. АСА хорошо оптимизирована в этом плане и время выполнения операций/запросов/процедур в миллисекундах доходит до фактического нуля. Да что Вы говорите :) Давайте напишем AFTER FOR EACH ROW триггер на UPDATE таблицы с 20 полями, в котором анализируется, какие поля были изменены и по итогам анализа формируется и вставляется запись в таблицу аудита. А потом возьмем и сделаем пакетный UPDATE этой таблицы на миллион записей и сравним, как оно будет работать с триггером и как без триггера. Когда мы это сделаем, то сделаем закономерный следующий ход ... повесим на триггер условие WHEN VarExists(), чтобы была возможность отключать его во время пакетных изменений таблицы. Этот ход вынудит нас ввести дополнительное условие обновления таблицы - все процессы, делающие массовые обновления данной таблицы должны перед выполнением UPDATE создавать глобальную переменную для отключения триггера и удалять ее после проведения операции. Кода всем добавилось, централизованная логика размылась, ибо гарантировать, что где то не забыли создать и удалить такую переменную никто не может. Поэтому не вижу здесь смысла в такой овчинке, гораздо легче увести аудит на клиента или обязать клиентское приложение работать через бинес слой ХП или вьюверов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2009, 09:37 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
ASCRUS Да что Вы говорите :) Давайте напишем AFTER FOR EACH ROW триггер на UPDATE таблицы с 20 полями, в котором анализируется, какие поля были изменены и по итогам анализа формируется и вставляется запись в таблицу аудита. А потом возьмем и сделаем пакетный UPDATE этой таблицы на миллион записей и сравним, как оно будет работать с триггером и как без триггера. Когда мы это сделаем, то сделаем закономерный следующий ход ... повесим на триггер условие WHEN VarExists(), чтобы была возможность отключать его во время пакетных изменений таблицы. Этот ход вынудит нас ввести дополнительное условие обновления таблицы - все процессы, делающие массовые обновления данной таблицы должны перед выполнением UPDATE создавать глобальную переменную для отключения триггера и удалять ее после проведения операции. Кода всем добавилось, централизованная логика размылась, ибо гарантировать, что где то не забыли создать и удалить такую переменную никто не может. Поэтому не вижу здесь смысла в такой овчинке, гораздо легче увести аудит на клиента или обязать клиентское приложение работать через бинес слой ХП или вьюверов. Все это так, да вот только в жизни я не видел клиента, который вызывает обновление всей таблицы, обычно это делает или разработчик или администратор, и то довольно редко и обычно, когда нет работающих клиентов, можно и подождать, а вот кто, когда и что изменил в записи, вот с этим приходится разбираться довольно часто... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2009, 10:40 |
|
||
|
trigger в ASA 9-10
|
|||
|---|---|---|---|
|
#18+
Sergey OrlovВсе это так, да вот только в жизни я не видел клиента, который вызывает обновление всей таблицы, обычно это делает или разработчик или администратор, и то довольно редко и обычно, когда нет работающих клиентов, можно и подождать, а вот кто, когда и что изменил в записи, вот с этим приходится разбираться довольно часто... Все зависит от задачи. В таких задачах как биллинги (коммуналка, телекоммуникация), системы статистического сбора и анализа информации массовые операции над большими объемами данных (импорт информации, расчеты, перерасчеты) вполне нормальное обычное явление и логировать их в аудит, да еще с изменением по полям - получается дорогостоящей операцией. Чтобы спор не выливался в религиозный, замечу, что я не против триггеров, но я за то, что детализация системы аудита должна быть обоснованной в рамках задачи ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2009, 11:20 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=39&tid=2011072]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 372ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...