|
|
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
Подскажите можно ли написать триггер на 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' может можно как то по другому написать или обойти можно конечно прописать поля вручную но не хотелось бы потому что структура таблицы может изменить и каждый раз надо помнить что триггер надо править. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 15:10 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
marka_mmm, Очень путано написано. Что клиент требует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 15:43 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
требует вести учет кто когда и что правил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:19 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
marka_mmm, Различайте вставку, изменение, удаление, при вставке нет old value, при удалениии нет new value ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:57 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
marka_mmm, Откройте для себя утилиту dbtran. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 17:29 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
marka-mmm, Кто и когда - не проблема. Главное определиться - что Как правило, изменение каждого поля записей таблиц в журнал писать не целесообразно. Я не думаю, что клиенту будет интересно копаться в полях таблиц. Обычно в журнал систем учета пишут не изменения полей, а историю операций над бизнес объектами системы учета(документы, товары и т.п.) и изменения важных с точки зрения аудита полей. Можно и триггеры использовать, Sergey Orlov правильно замечания написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 18:09 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы, но увы они совершенно не по моему вопросу. утилиту dbtrun я прекрасно знаю, но клиента она не устраивает, он не сможет с ней работать. Что нецелесообразно вести такую таблицу я тоже прекрасно понимаю и как могла отговаривала клиента, но клиент именно ХОЧЕТ КОПАТЬСЯ по такой таблице, в которой будет храниться когда кем и какое поле таблицы изменено и его старое значение. Если Вы внимательно прочитаете мой вопрос «Подскажите можно ли написать триггер на UPDATE» я знаю, что существуют триггеры на delete update insert. Я задала вопрос четко про UPDATE (остальные решается аналогично, если я найду решение, как сделать триггер на UPDATE , я решу и на INSERT и DELETE). Мой вопрос заключается, в том, чтобы помочь написать триггер, используя внутри триггера курсор по системной таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 21:21 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
marka_mmm, Ну тогда вам прямая дорога в учебники и читать про команду create trigger. Если кратко (и без проверок на работоспособность) то примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 22:42 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
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 как таблицу я бы возможно знала как обойти и написать универсальный триггер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 23:32 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
marka_mmm при изменении структуры таблицы добавления поля придется править и сам триггер, а этого бы делать не хотелось, хотелось бы сразу написать универсальный.А смысл? Как часто вы меняете структуру таблиц? marka_mmm Код: plaintext 1. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2009, 04:57 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
White Owl, Как написать запрос мне в данный момент не важно, такой запрос тоже работает - важно как написать потом. Но было бы очень интересно узнать чем этот запрос лучше моего. Я работаю с сервером (ASA 7.0.4.3519) и триггер на UPDATE ругается, что таблица old не найдена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2009, 09:42 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
еще раз отмечу, сейчас только что еще раз проверила версия 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 а так проходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2009, 09:52 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
Я так понимаю что проблема с динамическим sql, не видет ссылки на старую и новую строку? Решение - написать генератор текста для триггеров на том же watcom sql И запускать его хоть после каждого изменения базы Можно и на автомате в event но стремно без проверки Советы: 1) НЕ надо все протоколировать - база сдохнет... Предусмотрите фильтры по списку необходимых полей Сам триггера такие писал вручную по выборочному списку полей- все работает Но журнал за год раз в 20 больше самой большой содержательной таблы 2) Предусмотрите интерфейс вызова истории строки, поля, удаленных строк документа... изнутри программы Иначе никто ничего в журнале не найдет Есть вопросы - пишите avgritsenko@ya.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2009, 15:01 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
Гриценко А.В., Спасибо Решение - написать генератор текста для триггеров на том же watcom sql И запускать его хоть после каждого изменения базы это у меня был запасной вариант, если не получится тот на данный момент практически так все и реализовала как Вы написали но я не понимаю почему же в триггере не видет старую и новую строку в динамическом sql причем что странно по некоторым полям видит а по некоторым нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2009, 23:49 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
ХЗ В ASA много странностей в каждой версии и билде своих Семерку пользовал недолго - устарела она уже сильно 11 - актуальна Возможно в другой реализации все и работает НО! По производительности однозначно лучше генерить тексты один раз чем при каждом движении лазить по системным таблицам и тп Кстати есть еще PowerDesigner (есть в пакете SQL Anywhere Studio) - он умеет делать те же триггера по шаблонам и вообще всю базу целиком + документирование проекта и много прочих полезностей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2009, 00:05 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
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 была бы таблицей... Правда, сейчас поздно и я могу и ошибаться.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2009, 00:06 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
marka_mmmРешение - написать генератор текста для триггеров на том же watcom sql И запускать его хоть после каждого изменения базы это у меня был запасной вариант, если не получится тот Мое мнение - это единственно удобоваримый вариант для любых РСУБД, так как всякие извраты в триггерах с курсорами, системными таблицами и прочим печально закончатся потерей производительности, сложностью сопровождения, неожиданными ошибками и т.д. Из плюсов генерации триггеров по шаблону - это возможность в любой момент оптимизировать, дополнить или изменить шаблон и перегенерировать триггера на все таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2009, 10:08 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
Код: plaintext А вот такая должна работать 100%, где в зависимости от типа поля (который нужно получать в курсоре вместе с его именем) будет выбираться соответствующий статмент: Для числовых полей Код: plaintext Код: plaintext Код: plaintext Код: plaintext авторУ вас триггер for each row, как мне кажется, в данном случае нет таблиц типа inserted, deleted, а доступ к данным напрямую через old_row.имя столбца.... Если бы оно отсуствовало бы "for each row" или стояло for each statement, тогда да бы old_row была бы таблицей... +1 P.S.: При редактировании цитаты увидел, что t_nTo у автора окружено не двойными кавычками, а сдвоенными одинарными. Спишу на "странности перевода". P.P.S.: Вы не любите кошек? Да вы не умеете их готовить! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2009, 10:33 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
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 необходимо тоже добавить или скорректировать поля С Уважением АРТУР ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2009, 10:32 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
ARTURV пишет: > При добавдении или модификации полей в таблице лога, например, > WLogAeratedTank необходимо тоже добавить или скорректировать поля Проблема в том, что ленивый топикстартер не хочет этого делать. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2009, 11:00 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
Dim2000 ARTURV пишет: > При добавдении или модификации полей в таблице лога, например, > WLogAeratedTank необходимо тоже добавить или скорректировать поля Проблема в том, что ленивый топикстартер не хочет этого делать. А что у Вас любой "ленивый" может лазать в БД и менять структуру? Тогда Ваша база никогда не будет работать. Ведь всегда есть квалифицированные специалисты, которые отвечают за работу системы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2009, 11:09 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
ARTURVА что у Вас любой "ленивый" может лазать в БД и менять структуру? У меня - нет. Но у меня нет и проблемы, которую мы в этом топике обсуждаем ;). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2009, 19:13 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
"Любой уважающий себя математик должен быть ленивым" - так когда-то говорил препод по высшей математики в универе. Я часто перефразирую эту фразу на всякий лад, и в частности иногда и так: любой уважающий себя разработчик должен быть ленивым. Что плохого в том, чтобы избавить себя от дополнительных телодвижений в будущем путем составления универсального, статичного скрипта триггера?! Что плохого в том, что разработчик на этапе постройки системы пытается предусмотреть ее будущее и СВОИ действия на все случаи жизни?! Что плохого в желании заложить фундамент под непрописанное в ТЗ крыльцо, но которое в соответствии с опытом разработчика запросто может появится спустя полгода в связи с требованиями заказчика, только из-за того, что очень мало заказчиков способны вообще четко изложить что им нужно?! Ведь все зависит от задачи, ведь так?! Нам изначальная задача неизвестна, соответственно мы не можем однозначно определить меру правильности данного решения, мы можем обсуждать только пути реализации данного решения. Нужен заказчику полный аудит всего? Да пожалуйста, и не нужно держать ни в голове, ни еще где бы то ни было, что нужно сопровождать еще и триггеры и обновлять их скрипт и т.п. Чем меньше информации, тем лучше. Тем более, что данное решение при грамотном исполнении не добавит ограничений в производительности сервера и его функционала. Что каждый раз курсором перебирать поля, что в статике перебирать их же - одна фигня. Системная табличка осядет в кэше и все. Грандиозные скрипты с использованием десятка табличек способны выполняться за единицы миллисекунд при частом их дерганье, на то АСА и АДАПТИВНЫЙ!!! PS А вот если бы АСА позволяла вешать триггеры на системные таблицы, была бы вообще красотища. Можно было бы решать много второстепенных задачек, в том числе и по обновлению скриптов триггеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2009, 13:28 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
iLLerВедь все зависит от задачи, ведь так?! Нам изначальная задача неизвестна, соответственно мы не можем однозначно определить меру правильности данного решения, мы можем обсуждать только пути реализации данного решения. Вот с этого и надо начинать ... изначальная задача должна быть уточнена, детализирована, описана в документе, согласована с клиентом и т.д. Тогда мы на выходе имеем такое шикарные понятия как "Архитектура" и "Этапы работ" и не маемся фантазиями, как сделать что то, что потом может быть когда нибудь пригодится. Если от меня заказчик потребует сделать полный аудит ... ну чтож, я его сделаю, но сразу документально зафиксирую, что он не вправе требовать от меня производительности при большом кол-ве изменений данных от множества пользователей и так же увеличу стоимость разработки проекта. После этого как альтернативу предложу частичный аудит (те же LAST USER и TIMESTAMP) и где нужно аудит по бизнес действиям пользователей (такой то запустил то то) - чаще всего оказывается, что заказчику этого оказывается достаточно для работы и он просто разгибал пальцы, сам не понимая, что хочет и не осознавая, что никто этим пользоваться не будет. В конце концов им всегда можно предложить более простой вариант, с уточнением, что там, где этого будет мало, всегда можно заключить доп соглашение и по нему доработать более детализированный аудит. iLLerPS А вот если бы АСА позволяла вешать триггеры на системные таблицы, была бы вообще красотища. Можно было бы решать много второстепенных задачек, в том числе и по обновлению скриптов триггеров. А если пользоваться тем же PD с репозиторием, то получается, что необходимости в триггерах на системные таблицы нет ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2009, 10:11 |
|
||
|
ASA 7 триггеры на изменения
|
|||
|---|---|---|---|
|
#18+
ASCRUS...чаще всего оказывается, что заказчику этого оказывается достаточно для работы и он просто разгибал пальцы, сам не понимая, что хочет и не осознавая, что никто этим пользоваться не будет. +1 Именно от этого все и бывает, что толком никто сказать ничего не может. ASCRUSА если пользоваться тем же PD с репозиторием, то получается, что необходимости в триггерах на системные таблицы нет ;) Не всегда PD может помочь. Мне, например, хотелось бы получить триггер на добавление пользователя. Некий софт создает пользователей. Этот софт выступает как исходные данные, моя задача отловить в БД эти процессы. PD здесь поможет? Можно только отхватить в принципе создание пользователя на свою логику и там параллельно реализовать. Но это ж дополнительные пляски с бубнами. Причем однозначно на стороне клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2009, 10:38 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=36097701&tid=2010961]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
158ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 507ms |

| 0 / 0 |

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