|
Логирование изменений
|
|||
---|---|---|---|
#18+
Добрый день. Опишу задачу: необходимо логировать данные в БД, пока только удаление. Знаю, что в IBExpert есть своя штука для этого. Но хочется под себя. Чтобы написанный один единственный триггер / процедуру можно было размножить на все таблицы с минимальными изменениями самого триггера / процедуры. Созданы две таблицы LOG_TABLES, LOG_FIELDS. Алгоритм решения: из системных таблиц нахожу все поля конкретной таблицы, для которой хочу после удаления из нее записи сделать лог в таблицах логирования. Значение old для каждого поля пишем в таблицу логирования. Все. Проблема: хочу к контекстной переменной Old добавить названия полей и именно это значение писать в лог-таблицу. Т.е. неким образом превратить ее опять в контекстную после конкатенации и выполнить запись. Возможно это? :context_old_value = 'old.'||lower(:field_name); :deleted_value = :context_old_value; s = 'insert into LOG_FIELDS (LOG_TABLE_ID,FIELD_NAME, FIELD_TYPE, OLD_VALUE) values (?,?,?,?)'; execute statement (:s) (:sequence_id,:field_name,:type_data,:deleted_value) Записывает он здесь, конечно, как текст. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 15:42 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
romero111, создай себе процедуру которая автоматически будет генерировать текст логирующего триггера для произвольной таблицы. Потом выполни эту ХП для всех нужных таблиц из результатов собери скрипт. Это не сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 15:59 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
1. нужно учитывать NULL-ы 2. вещественные числа Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 16:03 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
я и собираюсь составить некий текст триггера. Но пробела в том, что я соберу все названия полей таблицы: пусть 'field1', 'field2', 'field3'. Присобачу к OLD это имя - и это уже будет текст, а не контекстная переменная. В переменной ins_field_value = названия поля таблицы = 'field1'. insert into log_table (field_name,flield_value) values ('field1','old.'||ins_field_value ) Он вставить запись в flield_value как текст = 'old.field1'. Мне же надо, что он взял как контекстную переменную этот параметр и вставил туда значение поля field1. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 16:12 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
romero111я и собираюсь составить некий текст триггера. Обломись. Не может быть "универсального протоколирующего триггера". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 16:16 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
romero111, тебе говорят собирай текст триггера целиком как строку и скармливай её выполнителю скрипта ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 16:33 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovromero111я и собираюсь составить некий текст триггера. Обломись. Не может быть "универсального протоколирующего триггера".Ну почему же. Такая задача, и многие другие, уже решены здесь: http://button.dekel.ru/ ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 21:05 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
Симонов Денис, процка создана (где входящие параметры Таблица и Операция). Создается длиннющая строка текста триггера. Но проблема то этим не решилась: я ее (строку) вставляю в выполнитель скриптов, но последняя моя операция в этом скрипте, как и описано в самом первом сообщении, никак не преобразилась. Т.е. она осталась текстовым полем, а мне ее надо скормить как old.field_name, а не как 'old.field_name'. Задача: я беру все поля таблицы и хочу записать их значения при удалении из таблицы в таблицу лога. Делать хочу это в триггере на before_delete. Где есть контекстная переменная OLD. Хочу к ней в цикле (или как хотите называйте) присобачивать по очереди названия полей и получать значение, которые записывать в лог. С присобавчиванием (конкатенацией) проблем нет, есть проблема, что эта переменная уже не является контекстной и не выполняет свои "функции", а просто превратилась в текст. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 10:06 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
romero111, "execute statement" не выполняет скрипт? Или что? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 10:40 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
romero111, ещё раз объясняю. Так сделать нельзя. Поля после OLD надо указывать в явном виде. Т.е. создать универсальный триггер не получится, но можно сделать процедуру которая облегчит написание таких триггеров. Вот кусок моего пакета для записи логов. Тебе он не подойдёт, но ты можешь уловить мысль Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 10:43 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
KreatorXXI, выполняется, но не хочет понимать old.tag_id, например. Сейчас :field_name = tag_id. :field_value = 'old.' || lower(:field_name); execute statement 'insert into LOG_FIELDS (LOG_TABLE_ID,FIELD_NAME, FIELD_TYPE, INT_VALUE) values (' || :sequence_id || ',''' || :field_name || ''',''' || :type_data || ''',' || :field_value || ')' on external :setting_value as user :user_login password :user_pass; Пишет, что не знает такое поле.... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 10:57 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
Симонов Денис, красиво. Спасибо, что поделились творчеством. Полезная идея. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 10:58 |
|
Логирование изменений
|
|||
---|---|---|---|
#18+
romero111, оператор, выполняемый execute statement не имеет доступа к "внешнему" контексту. Допустим, когда оно вызывается из триггера, оператор ES ни про какой триггер понятия не имеет. Он выполняется точно так же, как любой клиентский запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 13:16 |
|
|
start [/forum/topic.php?fid=40&fpage=20&tid=1560583]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 414ms |
0 / 0 |