|
|
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Коллеги, прошу совета. Задача такая - показывать историю изменений заявок в виде: название поля заявки старое значение новое значение. И только те поля, которые изменились. То есть если из 10 полей поменялось значение в 3, то показывать только их. Я сделал в таком виде: Пишу старое и новое значение каждого поля в массив, дальше прохожусь по нему, если есть изменение значения, то пишу в таблицу с изменениями. Код: plsql 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. 42. 43. 44. 45. 46. Приходится перечислять все поля, и менять триггер при добавлении полей. Если забыть добавить, то изменения поля не будет писаться в историю. Есть ли решение получше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 12:00 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 12:42 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
rybinglebЕсть ли решение получше? Генерировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 12:42 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
rybingleb, Напиши JOB или DDL триггер который будет автоматически создавать тригер по изменению структуры и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 12:50 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
rybingleb Приходится перечислять все поля, и менять триггер при добавлении полей. Если забыть добавить, то изменения поля не будет писаться в историю. Есть ли решение получше? імхо, изменение структуры дело серьезное, забыть поменять триггер сложно вспомнят, поменяете зы я б массив не запролнял, сразу в add_rec делал инсерт с учетом изменений .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 13:14 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
rybinglebЕсть ли решение получше? Если бы оракель не решил прибить oracle streams, то оно было бы "самое то". Если есть возможность - посмотрите на Golden Gate или его аналоги. Кроме того, возможно что-то построить просто на базе logminer. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 14:36 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousЕсли бы оракель не решил прибить oracle streams, то оно было бы "самое то". Если есть возможность - посмотрите на Golden Gate или его аналоги. Кроме того, возможно что-то построить просто на базе logminer.Из пушки - по амёбам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 15:25 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
rybinglebПриходится перечислять все поля, и менять триггер при добавлении полей. Если забыть добавить, то изменения поля не будет писаться в историю. Есть ли решение получше? в системе с которой сейчас работаю, аналогичную задачу сделали на динамическом SQL Использование динамического SQL в триггерах - вводит в шок, но как-то работает. Производительность ниже плинтуса, но сервер пока вытягивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 15:40 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, :new/:old видны в execute immediate? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 15:54 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Stax Я в этот код еще даже и не заглядывал. Но на удивление работает ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 15:59 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЯ в этот код еще даже и не заглядывал. Но на удивление работает )))Скорее всего, ты чего-то напутал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 16:12 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
ElicLeonid KudryavtsevЯ в этот код еще даже и не заглядывал. Но на удивление работает )))Скорее всего, ты чего-то напутал. Переопределены триггеры: BEFORE INSERT OR UPDATE OR DELETE --> Init_History() INSERT OR DELETE OR UPDATE REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW --> Add_Key(v_Rec_ID, 'id', :NEW.ID); + Check_All_Keys() + куча другого кода AFTER INSERT OR UPDATE OR DELETE ---> Close_Rec_In_History В общем, IMHO допиленная классическая схема обхода table mutating. For each row - запоминаем ID, по окончанию statement'а, select'ом уже достаем данные из исходной таблицы и перекладываем в History Подробно не смотрел. Не очень интересно. Я бы так не делал (полное убийство производительности). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 16:23 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, 'id' :NEW.ID вбито в код (как у rybingleb ), а надо формировать динамически, напр со словаря .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 16:53 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Всем спасибо. Список полей я конечно не вручную набираю ) Код: plsql 1. 2. 3. 4. 5. 6. По поводу динамического SQL в первую очередь подумал, но там не видны :old и :new. "Напиши JOB или DDL триггер который будет автоматически создавать тригер по изменению структуры и всё." Ну это конечно для моей задачи слишком круто, не так уже часто будет определение таблицы меняться ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 17:58 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
На правах бреда (мозгового штурма) а можно new и old в Java пропихнуть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 18:06 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevа можно new и old в Java пропихнуть ?1) Накуя козе баян. 2) new - это ключевое слово, а не запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 18:26 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Elicandrey_anonymousЕсли бы оракель не решил прибить oracle streams, то оно было бы "самое то". Если есть возможность - посмотрите на Golden Gate или его аналоги. Кроме того, возможно что-то построить просто на базе logminer.Из пушки - по амёбам. Как сказать. Если, скажем, в теле2 уже есть OGG - то все делается очень просто и без лишних плясок. "По амёбам" - это так: Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 18:51 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
Уточню - это если [C]LOBов нет. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 19:15 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
SYУточню - это если [C]LOBов нет. ...а про LONG RAW лучше вообще не вспоминать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2018, 20:00 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousElicпропущено... Из пушки - по амёбам. Как сказать. Если, скажем, в теле2 уже есть OGG - то все делается очень просто и без лишних плясок. Нету ) Elicselect sequence$$, dmltype$$, old_new$$, val, some_dt from mlog$_dropme_l order by sequence$$ Не очень с этим знаком. А эти логи не чистятся? Будет ли там история через год-два? Как со скоростью выборки из них, по дате например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2018, 20:51 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
rybinglebElicselect sequence$$, dmltype$$, old_new$$, val, some_dt from mlog$_dropme_l order by sequence$$Цитировать научись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2018, 07:27 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
rybinglebКоллеги, прошу совета. Задача такая - показывать историю изменений заявок в виде: название поля заявки старое значение новое значение. И только те поля, которые изменились. То есть если из 10 полей поменялось значение в 3, то показывать только их. Я сделал в таком виде: Пишу старое и новое значение каждого поля в массив, дальше прохожусь по нему, если есть изменение значения, то пишу в таблицу с изменениями. Зачем мух и котлеты сваливать в одну кучу? Показывать пользователю некую формочку/отчет и обеспечить хранение информации это две разные задачи, сегодня требуется одна формочка, завтра еще две с другими требованиями по предоставлению данных. Решение с транспонированием строк в столбцы имеет весьма серьезные недостатки, во первых ты потерял информацию о типах и выполняешь преобразование в строку без указания формата преобразования, т.е. уже подложил себе мину замедленного действия, во вторых на таблице истории у тебя нет внешних ключей присутствующих на основной таблице, поэтому у тебя возможно появление в истории идентификаторов ссылающихся в никуда, соответственно восстановить историю уже не получится, в третьих при возникновении задач типа покажи исходную заявку или какое то состояние заявки тебе придется выполнить реконструкцию. И задача твоя не совсем понятна, если заявка меняется десять раз при этом все время меняются произвольные поля, одно поле может иметь несколько изменений, какое из старых значений ты должен при этом показывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2018, 12:27 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorРешение с транспонированием строк в столбцы имеет весьма серьезные недостатки, во первых ты потерял информацию о типах и выполняешь преобразование в строку без указания формата преобразованияТы хорошо подумал о том, кто на ком стоял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2018, 20:11 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
ElicТы хорошо подумал о том, кто на ком стоял? Когда записывал мысль уже не думал((, кончено же столбцы в строки, спасибо за поправку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 00:43 |
|
||
|
История изменений в виде "поле, старое значение, новое значение"
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorrybinglebКоллеги, прошу совета. Задача такая - показывать историю изменений заявок в виде: название поля заявки старое значение новое значение. И только те поля, которые изменились. То есть если из 10 полей поменялось значение в 3, то показывать только их. Я сделал в таком виде: Пишу старое и новое значение каждого поля в массив, дальше прохожусь по нему, если есть изменение значения, то пишу в таблицу с изменениями. Зачем мух и котлеты сваливать в одну кучу? Показывать пользователю некую формочку/отчет и обеспечить хранение информации это две разные задачи, сегодня требуется одна формочка, завтра еще две с другими требованиями по предоставлению данных. Решение с транспонированием строк в столбцы имеет весьма серьезные недостатки, во первых ты потерял информацию о типах и выполняешь преобразование в строку без указания формата преобразования, т.е. уже подложил себе мину замедленного действия, во вторых на таблице истории у тебя нет внешних ключей присутствующих на основной таблице, поэтому у тебя возможно появление в истории идентификаторов ссылающихся в никуда, соответственно восстановить историю уже не получится, в третьих при возникновении задач типа покажи исходную заявку или какое то состояние заявки тебе придется выполнить реконструкцию. Согласен, но задача ограничена только показом изменений в интерфейсе программы в удобном пользователю виде. Реконструкции или еще чего-то не предусматривается. SkilledJuniorИ задача твоя не совсем понятна, если заявка меняется десять раз при этом все время меняются произвольные поля, одно поле может иметь несколько изменений, какое из старых значений ты должен при этом показывать? Показывать надо все изменения 17.01.2018 в поле 1 значение 1 изменило на 2 17.01.2018 в поле 2 значение 1 изменило на 2 18.01.2018 в поле 1 значение 2 изменило на 3 ну и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 10:24 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39706718&tid=1883424]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
218ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 206ms |
| total: | 536ms |

| 0 / 0 |
