Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 7 триггеры на изменения / 25 сообщений из 25, страница 1 из 1
17.07.2009, 15:10
    #36095860
marka_mmm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
Подскажите можно ли написать триггер на UPDATE для ведения учета. что когда и кем менялось.
Видела, что такая тема уже поднималась. И вроде как отговаривают это делать, я тоже против, но клиент требует.
Хотелось бы пойти по пути в триггере построить курсор по системной таблице
select column_name from sys.systable t join sys.syscolumn c on (t.table_id=c.table_id)
where table_name='t_nTo'
и дальше заносить в таблицу старые значения
но запрос на вставку не удается написать
на часть полей запрос проходит на части тот же самый говорит что old_value таблица не найдена
execute immediate 'insert into dba.control select ''t_nTo'',old_value.ttt'
может можно как то по другому написать или обойти
можно конечно прописать поля вручную но не хотелось бы потому что структура таблицы может изменить и каждый раз надо помнить что триггер надо править.
...
Рейтинг: 0 / 0
17.07.2009, 15:43
    #36095964
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
marka_mmm,

Очень путано написано.
Что клиент требует?
...
Рейтинг: 0 / 0
17.07.2009, 16:19
    #36096066
marka-mmm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
требует вести учет кто когда и что правил
...
Рейтинг: 0 / 0
17.07.2009, 16:57
    #36096166
Sergey Orlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
marka_mmm,

Различайте вставку, изменение, удаление, при вставке нет old value, при удалениии нет new value
...
Рейтинг: 0 / 0
17.07.2009, 17:29
    #36096256
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
marka_mmm,

Откройте для себя утилиту dbtran.
...
Рейтинг: 0 / 0
17.07.2009, 18:09
    #36096328
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
marka-mmm,

Кто и когда - не проблема. Главное определиться - что
Как правило, изменение каждого поля записей таблиц в журнал писать не целесообразно.
Я не думаю, что клиенту будет интересно копаться в полях таблиц.
Обычно в журнал систем учета пишут не изменения полей, а историю операций над бизнес объектами системы учета(документы, товары и т.п.) и изменения важных с точки зрения аудита полей.
Можно и триггеры использовать, Sergey Orlov правильно замечания написал.
...
Рейтинг: 0 / 0
17.07.2009, 21:21
    #36096554
marka_mmm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
Спасибо за ответы, но увы они совершенно не по моему вопросу.
утилиту dbtrun я прекрасно знаю, но клиента она не устраивает, он не сможет с ней работать.
Что нецелесообразно вести такую таблицу я тоже прекрасно понимаю и как могла отговаривала клиента, но клиент именно ХОЧЕТ КОПАТЬСЯ по такой таблице, в которой будет храниться когда кем и какое поле таблицы изменено и его старое значение. Если Вы внимательно прочитаете мой вопрос «Подскажите можно ли написать триггер на UPDATE» я знаю, что существуют триггеры на delete update insert. Я задала вопрос четко про UPDATE (остальные решается аналогично, если я найду решение, как сделать триггер на UPDATE , я решу и на INSERT и DELETE). Мой вопрос заключается, в том, чтобы помочь написать триггер, используя внутри триггера курсор по системной таблице.
...
Рейтинг: 0 / 0
17.07.2009, 22:42
    #36096591
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
marka_mmm,

Ну тогда вам прямая дорога в учебники и читать про команду create trigger.
Если кратко (и без проверок на работоспособность) то примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create trigger tr_update after update on sometable
referencing old as old_row new as new_row
for each row
begin
   insert into audit_table (change_made_at, change_made_by,
                            f1_old, f2_old, f3_old, f1_new, f2_new, f3_new)
         select now(), current user,
                old_row.f1, old_row.f2, old_row.f3,
                new_row.f1, new_row.f2, new_row.f3
         from old_row, new_row;
end;
...
Рейтинг: 0 / 0
17.07.2009, 23:32
    #36096626
marka_mmm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
White Owl,
вы опять меня не поняли так и я писать умею это действительно открыл help и прочитал, но при изменении структуры таблицы добавления поля придется править и сам триггер, а этого бы делать не хотелось, хотелось бы сразу написать универсальный.

create trigger tr_update after update on sometable
referencing old as old_row new as new_row
for each row
begin
declare cur_rec dynamic scroll cursor for select column_name from syscolumn where table_id = (select table_id from systable where table_name = 'sometable') order by column_id asc;

...

open cur_rec;
MyLoopDa: loop
fetch next cur_rec into v_cln;
if sqlstate = err_notfound then leave MyLoopDa
end if;
...
end loop MyLoopDa;
close cur_rec;
....
end;

хотелось бы написать в такой конструкции

и хочу заметить
insert into audit select old_row.f1 from old_row
ругается, что таблица old_row не найдена

если бы триггер видел old_row как таблицу я бы возможно знала как обойти и написать универсальный триггер
...
Рейтинг: 0 / 0
18.07.2009, 04:57
    #36096698
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
marka_mmm при изменении структуры таблицы добавления поля придется править и сам триггер, а этого бы делать не хотелось, хотелось бы сразу написать универсальный.А смысл? Как часто вы меняете структуру таблиц?

marka_mmm
Код: plaintext
1.
  declare cur_rec dynamic scroll cursor for select column_name from syscolumn
 where table_id = (select table_id from systable where table_name = 'sometable') order by column_id asc;
Я сильно сомневаюсь в нужности таких извращений, но по идее этот путь может привести к желаемому...


marka_mmmи хочу заметить
insert into audit select old_row.f1 from old_row
ругается, что таблица old_row не найденаЭтого не может быть. Если это происходит, значит ошибка где-то рядом. В ASA триггер на insert знает new псевдо-таблицу, триггер на delete знает old, а триггер на update знает обе. Если в вашем сервере по другому, значит либо это не ASA, либо ошибка где-то рядом. Показывай текст триггера полностью будем искать опечатку.

и кстати курсор лучше описывать так:
Код: plaintext
1.
2.
3.
4.
declare cur_rec cursor for
  select column_name 
  from syscolumn
  join systable on syscolumn.table_id = systable.table_id and table_name = 'sometable'
  order by column_id asc;
...
Рейтинг: 0 / 0
18.07.2009, 09:42
    #36096722
marka_mmm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
White Owl,
Как написать запрос мне в данный момент не важно, такой запрос тоже работает - важно как написать потом. Но было бы очень интересно узнать чем этот запрос лучше моего.

Я работаю с сервером (ASA 7.0.4.3519) и триггер на UPDATE ругается, что таблица old не найдена.
...
Рейтинг: 0 / 0
18.07.2009, 09:52
    #36096724
maria_mmm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
еще раз отмечу, сейчас только что еще раз проверила
версия ASA 7.0.4.3519

insert into сontrol select old_row.id from old_row и insert into сontrol select id from old_row
ругается, что таблицы old_row нет

insert into control select old_row.id
а так проходит
...
Рейтинг: 0 / 0
19.07.2009, 15:01
    #36097453
ASA 7 триггеры на изменения
Я так понимаю что проблема с динамическим sql, не видет ссылки на старую и новую строку?

Решение - написать генератор текста для триггеров на том же watcom sql
И запускать его хоть после каждого изменения базы
Можно и на автомате в event но стремно без проверки


Советы:

1) НЕ надо все протоколировать - база сдохнет...
Предусмотрите фильтры по списку необходимых полей

Сам триггера такие писал вручную по выборочному списку полей- все работает
Но журнал за год раз в 20 больше самой большой содержательной таблы


2) Предусмотрите интерфейс вызова истории строки, поля, удаленных строк документа...
изнутри программы

Иначе никто ничего в журнале не найдет

Есть вопросы - пишите avgritsenko@ya.ru
...
Рейтинг: 0 / 0
19.07.2009, 23:49
    #36097691
marka_mmm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
Гриценко А.В.,
Спасибо

Решение - написать генератор текста для триггеров на том же watcom sql
И запускать его хоть после каждого изменения базы
это у меня был запасной вариант, если не получится тот

на данный момент практически так все и реализовала как Вы написали

но я не понимаю почему же в триггере не видет старую и новую строку в динамическом sql
причем что странно по некоторым полям видит а по некоторым нет
...
Рейтинг: 0 / 0
20.07.2009, 00:05
    #36097699
ASA 7 триггеры на изменения
ХЗ
В ASA много странностей в каждой версии и билде своих
Семерку пользовал недолго - устарела она уже сильно 11 - актуальна
Возможно в другой реализации все и работает

НО!
По производительности однозначно лучше генерить тексты один раз
чем при каждом движении лазить по системным таблицам и тп

Кстати есть еще PowerDesigner (есть в пакете SQL Anywhere Studio) - он умеет делать те же триггера по шаблонам и вообще всю базу целиком + документирование проекта и много прочих полезностей
...
Рейтинг: 0 / 0
20.07.2009, 00:06
    #36097701
Sergey Orlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
maria_mmmеще раз отмечу, сейчас только что еще раз проверила
версия ASA 7.0.4.3519

insert into сontrol select old_row.id from old_row и insert into сontrol select id from old_row
ругается, что таблицы old_row нет

insert into control select old_row.id
а так проходит
У вас триггер for each row, как мне кажется, в данном случае нет таблиц типа inserted, deleted, а доступ к данным напрямую через old_row.имя столбца.... Если бы оно отсуствовало бы "for each row" или стояло for each statement, тогда да бы old_row была бы таблицей...
Правда, сейчас поздно и я могу и ошибаться..
...
Рейтинг: 0 / 0
20.07.2009, 10:08
    #36097909
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
marka_mmmРешение - написать генератор текста для триггеров на том же watcom sql
И запускать его хоть после каждого изменения базы
это у меня был запасной вариант, если не получится тот
Мое мнение - это единственно удобоваримый вариант для любых РСУБД, так как всякие извраты в триггерах с курсорами, системными таблицами и прочим печально закончатся потерей производительности, сложностью сопровождения, неожиданными ошибками и т.д. Из плюсов генерации триггеров по шаблону - это возможность в любой момент оптимизировать, дополнить или изменить шаблон и перегенерировать триггера на все таблицы.
...
Рейтинг: 0 / 0
20.07.2009, 10:33
    #36097963
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
Код: plaintext
execute immediate 'insert into dba.control select ''t_nTo'',old_value.ttt';
Сдается мне, что в 7-ке такая конструкция не должна работать.
А вот такая должна работать 100%, где в зависимости от типа поля (который нужно получать в курсоре вместе с его именем) будет выбираться соответствующий статмент:
Для числовых полей
Код: plaintext
execute immediate 'insert into dba.control select "t_nTo",' || convert(char,old_value.ttt);
Для дат
Код: plaintext
execute immediate 'insert into dba.control select "t_nTo",''' || convert(char,old_value.ttt, 104 ) || '''';
Для таймштампов
Код: plaintext
execute immediate 'insert into dba.control select "t_nTo",''' || convert(char,old_value.ttt, 121 ) || '''';
Для символьных полей (norm_str функция удвоения терминального символа одиночной кавычки)
Код: plaintext
execute immediate 'insert into dba.control select "t_nTo",''' || norm_str(old_value.ttt) || '''';
Old_value&New_value - ни какие не таблицы, а специальные альясы, использовать их во from нельзя. Есть deleted,inserted таблицы, но для статмент-триггеров, а не построчных.
авторУ вас триггер for each row, как мне кажется, в данном случае нет таблиц типа inserted, deleted, а доступ к данным напрямую через old_row.имя столбца.... Если бы оно отсуствовало бы "for each row" или стояло for each statement, тогда да бы old_row была бы таблицей...
+1
P.S.: При редактировании цитаты увидел, что t_nTo у автора окружено не двойными кавычками, а сдвоенными одинарными. Спишу на "странности перевода".
P.P.S.: Вы не любите кошек? Да вы не умеете их готовить!
...
Рейтинг: 0 / 0
24.07.2009, 10:32
    #36107102
ARTURV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
maria_mmm,


Добрый день
Если по простому, то создаете таблицы аналогичные основным и на UPDATE пишете триггер типа
ALTER TRIGGER "UP_AeratedTank" BEFORE UPDATE
ORDER 1 ON "DBA"."AeratedTank"
REFERENCING OLD AS old_name NEW AS new_name
FOR EACH ROW /* WHEN( search_condition ) */
BEGIN
insert into "DBA"."WLogAeratedTank" select * FROM "DBA"."AeratedTank" where SW_Id=old_name.SW_Id and Eprn_N=old_name.Eprn_N and ArTnk_N=old_name.ArTnk_N;
set new_name."UserCreated"=current_user;
set new_name."DateCreated"=current_timestamp;
END

При добавдении или модификации полей в таблице лога, например, WLogAeratedTank необходимо тоже добавить или скорректировать поля

С Уважением АРТУР
...
Рейтинг: 0 / 0
24.07.2009, 11:00
    #36107184
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
ARTURV пишет:

> При добавдении или модификации полей в таблице лога, например,
> WLogAeratedTank необходимо тоже добавить или скорректировать поля

Проблема в том, что ленивый топикстартер не хочет этого делать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25.07.2009, 11:09
    #36109073
ARTURV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
Dim2000
ARTURV пишет:

> При добавдении или модификации полей в таблице лога, например,
> WLogAeratedTank необходимо тоже добавить или скорректировать поля

Проблема в том, что ленивый топикстартер не хочет этого делать.


А что у Вас любой "ленивый" может лазать в БД и менять структуру?
Тогда Ваша база никогда не будет работать. Ведь всегда есть квалифицированные специалисты, которые отвечают за работу системы
...
Рейтинг: 0 / 0
25.07.2009, 19:13
    #36109226
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
ARTURVА что у Вас любой "ленивый" может лазать в БД и менять структуру?
У меня - нет. Но у меня нет и проблемы, которую мы в этом топике обсуждаем ;).
...
Рейтинг: 0 / 0
26.07.2009, 13:28
    #36109511
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
"Любой уважающий себя математик должен быть ленивым" - так когда-то говорил препод по высшей математики в универе. Я часто перефразирую эту фразу на всякий лад, и в частности иногда и так: любой уважающий себя разработчик должен быть ленивым.
Что плохого в том, чтобы избавить себя от дополнительных телодвижений в будущем путем составления универсального, статичного скрипта триггера?! Что плохого в том, что разработчик на этапе постройки системы пытается предусмотреть ее будущее и СВОИ действия на все случаи жизни?! Что плохого в желании заложить фундамент под непрописанное в ТЗ крыльцо, но которое в соответствии с опытом разработчика запросто может появится спустя полгода в связи с требованиями заказчика, только из-за того, что очень мало заказчиков способны вообще четко изложить что им нужно?!
Ведь все зависит от задачи, ведь так?! Нам изначальная задача неизвестна, соответственно мы не можем однозначно определить меру правильности данного решения, мы можем обсуждать только пути реализации данного решения. Нужен заказчику полный аудит всего? Да пожалуйста, и не нужно держать ни в голове, ни еще где бы то ни было, что нужно сопровождать еще и триггеры и обновлять их скрипт и т.п. Чем меньше информации, тем лучше. Тем более, что данное решение при грамотном исполнении не добавит ограничений в производительности сервера и его функционала.
Что каждый раз курсором перебирать поля, что в статике перебирать их же - одна фигня. Системная табличка осядет в кэше и все. Грандиозные скрипты с использованием десятка табличек способны выполняться за единицы миллисекунд при частом их дерганье, на то АСА и АДАПТИВНЫЙ!!!

PS А вот если бы АСА позволяла вешать триггеры на системные таблицы, была бы вообще красотища. Можно было бы решать много второстепенных задачек, в том числе и по обновлению скриптов триггеров.
...
Рейтинг: 0 / 0
27.07.2009, 10:11
    #36110105
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
iLLerВедь все зависит от задачи, ведь так?! Нам изначальная задача неизвестна, соответственно мы не можем однозначно определить меру правильности данного решения, мы можем обсуждать только пути реализации данного решения.
Вот с этого и надо начинать ... изначальная задача должна быть уточнена, детализирована, описана в документе, согласована с клиентом и т.д. Тогда мы на выходе имеем такое шикарные понятия как "Архитектура" и "Этапы работ" и не маемся фантазиями, как сделать что то, что потом может быть когда нибудь пригодится. Если от меня заказчик потребует сделать полный аудит ... ну чтож, я его сделаю, но сразу документально зафиксирую, что он не вправе требовать от меня производительности при большом кол-ве изменений данных от множества пользователей и так же увеличу стоимость разработки проекта. После этого как альтернативу предложу частичный аудит (те же LAST USER и TIMESTAMP) и где нужно аудит по бизнес действиям пользователей (такой то запустил то то) - чаще всего оказывается, что заказчику этого оказывается достаточно для работы и он просто разгибал пальцы, сам не понимая, что хочет и не осознавая, что никто этим пользоваться не будет. В конце концов им всегда можно предложить более простой вариант, с уточнением, что там, где этого будет мало, всегда можно заключить доп соглашение и по нему доработать более детализированный аудит.

iLLerPS А вот если бы АСА позволяла вешать триггеры на системные таблицы, была бы вообще красотища. Можно было бы решать много второстепенных задачек, в том числе и по обновлению скриптов триггеров.
А если пользоваться тем же PD с репозиторием, то получается, что необходимости в триггерах на системные таблицы нет ;)
...
Рейтинг: 0 / 0
28.07.2009, 10:38
    #36112666
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7 триггеры на изменения
ASCRUS...чаще всего оказывается, что заказчику этого оказывается достаточно для работы и он просто разгибал пальцы, сам не понимая, что хочет и не осознавая, что никто этим пользоваться не будет.
+1
Именно от этого все и бывает, что толком никто сказать ничего не может.

ASCRUSА если пользоваться тем же PD с репозиторием, то получается, что необходимости в триггерах на системные таблицы нет ;)
Не всегда PD может помочь. Мне, например, хотелось бы получить триггер на добавление пользователя. Некий софт создает пользователей. Этот софт выступает как исходные данные, моя задача отловить в БД эти процессы. PD здесь поможет?
Можно только отхватить в принципе создание пользователя на свою логику и там параллельно реализовать. Но это ж дополнительные пляски с бубнами. Причем однозначно на стороне клиента.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 7 триггеры на изменения / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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