powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / trigger в ASA 9-10
16 сообщений из 16, страница 1 из 1
trigger в ASA 9-10
    #35887110
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые коллеги
Подскажите, нет ли системной функции для определения в триггере Update, какое поле обновлено.
Спасибо.
Артур
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35887239
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARTURVУважаемые коллеги
Подскажите, нет ли системной функции для определения в триггере Update, какое поле обновлено.
Спасибо.
Артур
В триггере пишите:
Код: plaintext
1.
2.
IF Update(Поле1) THEN
 ...
END IF;
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35887334
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ.
Но мне хотелось бы не указывать конкретнное поле а получить имя поля, которое обновляется, а лучше список, если обновляется несколько полей. Хотелось бы вести свой лог изменений
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35888821
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARTURVСпасибо за ответ.
Но мне хотелось бы не указывать конкретнное поле а получить имя поля, которое обновляется, а лучше список, если обновляется несколько полей. Хотелось бы вести свой лог изменений
Не стоит аудит вешать на триггера - называется прощай производительность и здравствуй тормоза. Быстрый способ обеспечить простейший аудит - на каждую таблицу сделать 2 колонки с DEFAULT значениями "Last User" и "TimeStamp" - в них ASA автоматически будет фиксировать логин пользователя и время во время добавления или изменения записи. Если же хотите заморочиться серьезнее, то значит нужно выносить механизм аудита на клиентскую часть или же делать сохранение данных клиентской части через ХП, в которых анализировать изменения и фиксировать их в логе.
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35889228
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотря для каких целей вы хотите это делать.

Если для фиксирования изменений (например для рукописной репликации) то
Вариант 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.
select column_name from sys.systable t join sys.syscolumn c on (t.table_id=c.table_id)
where table_name='t_nTo'

в которой содержатся поля этой таблицы и в цикле проверяете каждое поле (правда SQL запрос вам придется формировать вручную) - если изменилось то это поле пишете во временную таблицу (или в переменную через запятую или ...)
-используете полученный результат на свое усмотрение

Но как правильно заметил уважаемый ASCRUS автор"называется прощай производительность и здравствуй тормоза"

Вы бы описали более точно задачу ... может сообща и найдем более приемлемое решение.
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35889609
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSARTURVСпасибо за ответ.
Но мне хотелось бы не указывать конкретнное поле а получить имя поля, которое обновляется, а лучше список, если обновляется несколько полей. Хотелось бы вести свой лог изменений
Не стоит аудит вешать на триггера - называется прощай производительность и здравствуй тормоза. Быстрый способ обеспечить простейший аудит - на каждую таблицу сделать 2 колонки с DEFAULT значениями "Last User" и "TimeStamp" - в них ASA автоматически будет фиксировать логин пользователя и время во время добавления или изменения записи. Если же хотите заморочиться серьезнее, то значит нужно выносить механизм аудита на клиентскую часть или же делать сохранение данных клиентской части через ХП, в которых анализировать изменения и фиксировать их в логе.

Спасибо за ответы
Очевидно буду переносить ведение лога на клиента
Как рекомендует ASCRUS использовать "Last User" и "TimeStamp" - я раньше так и делал, но в данном случае мне необходимо фиксировать все изменения во времени и по пользователям.
БД будет небольшая и тем ввода низкий.
Я всегда старался обработку максимально переносить в сервер, а клиент в основном это "отображаловка". Возможно пойду по пути просто Insert - ов вместо Update и Delete, но это приводит к избыточности данных или, как советует ASCRUS, писать все в клиентской части.

Еще раз спасибо
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35889703
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARTURVВозможно пойду по пути просто Insert - ов вместо Update и Delete, но это приводит к избыточности данныхНикакой избыточности. Наоборот очень удобно для всех (ну или почти всех) таблиц делать дополнительные поля Start/End_Date и фиксировать в них период активности данной строки.
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35889955
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я просто тупо пишу новые данные в таблицы_log, где есть дополнительные поля с current user, current date, current time и имя машины, с которой все делается, ну и триггер на ночь, который удаляет данные 2-х месячной давности...
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35931077
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНе стоит аудит вешать на триггера - называется прощай производительность и здравствуй тормоза.

Не согласен в корне. Я бы воздержался от такой категоричности, ведь все зависит от реализации. А иначе бы любые триггеры были бы признаны злом, однозначно вызывающим ступор сервера. Чем отличается аудит-триггер от триггера обновляющего агрегированный свод данных? Да ни чем! Более того, аудит-триггер порождает гарантированное, предсказуемое и ограниченное множество действий (вставка одной записи в аудит-таблицу), в отличии от триггеров других типов (возможные операции по дополнительной выборке, вставке/обновлению/удалению записей в других таблицах).

Так что, если производительность падает, то это еще не повод переносить на клиента ведение аудита. Особенно, когда вся бизнес-логика реализована на серваке. А в некоторых случаях, как доступ по HTTP, это и невозможно в принципе.
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35931195
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerТак что, если производительность падает, то это еще не повод переносить на клиента ведение аудита. Особенно, когда вся бизнес-логика реализована на серваке. А в некоторых случаях, как доступ по HTTP, это и невозможно в принципе.
Никто не мешает вынести запись данных в таблицы через ХП или в логический слой view + instead of триггера, в которых и будет писаться аудит. Это с одной стороны сохранит бизнес логику на сервере, с другой не будет тормозить массовые операции над таблицами (тем более что там аудит вряд ли будет нужен в виде фиксации каждой записи, измененной пользователем). Решений много, не спорю - но была поставлена общая задача - аудит с анализом изменения каждого поля записи, в этом случае я считаю вешать аудит на триггеры злом ;)
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35931210
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНикто не мешает вынести запись данных в таблицы через ХП или в логический слой view + instead of триггера, в которых и будет писаться аудит.

Чем вызов ХП с двумя инсертами (основной + аудит) отличается от основного инсерта + инсерта в аудит-триггере?

Ничем.

P.S.: А логировать массовые изменения, как ни крути, придется с двойным увеличением количества операций. Хоть из ХП, хоть из клиента... Триггер есть не только row, но и statment, который дернется один раз на обновлении хоть миллиона записей.
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35931266
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А анализ изменений - это вообще муха на луне. Процессору проще сделать миллион сравнений, чем тыщу чтений из памяти или одно чтение с диска. Так что на if, и прочие операции можно не обращать внимания. Профилировщик подтвердит мои слова, благо в 9-ке он есть.

А особенно если использовать нормальные серверные платформы, то данные зачастую оказываются не только в SQL кэше, но и в кэше процессорном. АСА хорошо оптимизирована в этом плане и время выполнения операций/запросов/процедур в миллисекундах доходит до фактического нуля.
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35932190
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerА анализ изменений - это вообще муха на луне. Процессору проще сделать миллион сравнений, чем тыщу чтений из памяти или одно чтение с диска. Так что на if, и прочие операции можно не обращать внимания. Профилировщик подтвердит мои слова, благо в 9-ке он есть.

А особенно если использовать нормальные серверные платформы, то данные зачастую оказываются не только в SQL кэше, но и в кэше процессорном. АСА хорошо оптимизирована в этом плане и время выполнения операций/запросов/процедур в миллисекундах доходит до фактического нуля.
Да что Вы говорите :) Давайте напишем AFTER FOR EACH ROW триггер на UPDATE таблицы с 20 полями, в котором анализируется, какие поля были изменены и по итогам анализа формируется и вставляется запись в таблицу аудита. А потом возьмем и сделаем пакетный UPDATE этой таблицы на миллион записей и сравним, как оно будет работать с триггером и как без триггера. Когда мы это сделаем, то сделаем закономерный следующий ход ... повесим на триггер условие WHEN VarExists(), чтобы была возможность отключать его во время пакетных изменений таблицы. Этот ход вынудит нас ввести дополнительное условие обновления таблицы - все процессы, делающие массовые обновления данной таблицы должны перед выполнением UPDATE создавать глобальную переменную для отключения триггера и удалять ее после проведения операции. Кода всем добавилось, централизованная логика размылась, ибо гарантировать, что где то не забыли создать и удалить такую переменную никто не может. Поэтому не вижу здесь смысла в такой овчинке, гораздо легче увести аудит на клиента или обязать клиентское приложение работать через бинес слой ХП или вьюверов.
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35932392
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Да что Вы говорите :) Давайте напишем AFTER FOR EACH ROW триггер на UPDATE таблицы с 20 полями, в котором анализируется, какие поля были изменены и по итогам анализа формируется и вставляется запись в таблицу аудита. А потом возьмем и сделаем пакетный UPDATE этой таблицы на миллион записей и сравним, как оно будет работать с триггером и как без триггера. Когда мы это сделаем, то сделаем закономерный следующий ход ... повесим на триггер условие WHEN VarExists(), чтобы была возможность отключать его во время пакетных изменений таблицы. Этот ход вынудит нас ввести дополнительное условие обновления таблицы - все процессы, делающие массовые обновления данной таблицы должны перед выполнением UPDATE создавать глобальную переменную для отключения триггера и удалять ее после проведения операции. Кода всем добавилось, централизованная логика размылась, ибо гарантировать, что где то не забыли создать и удалить такую переменную никто не может. Поэтому не вижу здесь смысла в такой овчинке, гораздо легче увести аудит на клиента или обязать клиентское приложение работать через бинес слой ХП или вьюверов.
Все это так, да вот только в жизни я не видел клиента, который вызывает обновление всей таблицы, обычно это делает или разработчик или администратор, и то довольно редко и обычно, когда нет работающих клиентов, можно и подождать, а вот кто, когда и что изменил в записи, вот с этим приходится разбираться довольно часто...
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35932560
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey OrlovВсе это так, да вот только в жизни я не видел клиента, который вызывает обновление всей таблицы, обычно это делает или разработчик или администратор, и то довольно редко и обычно, когда нет работающих клиентов, можно и подождать, а вот кто, когда и что изменил в записи, вот с этим приходится разбираться довольно часто...
Все зависит от задачи. В таких задачах как биллинги (коммуналка, телекоммуникация), системы статистического сбора и анализа информации массовые операции над большими объемами данных (импорт информации, расчеты, перерасчеты) вполне нормальное обычное явление и логировать их в аудит, да еще с изменением по полям - получается дорогостоящей операцией. Чтобы спор не выливался в религиозный, замечу, что я не против триггеров, но я за то, что детализация системы аудита должна быть обоснованной в рамках задачи ;)
...
Рейтинг: 0 / 0
trigger в ASA 9-10
    #35934537
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS,

Абсалютно с тобой согласен, все зависит от задачи, софта, железа, а также от таких нюансов, как хорошее настроение разаработчика...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / trigger в ASA 9-10
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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