|
13.01.2021, 13:48 | #1 |
Участник
|
А если просто в журнале базы данных SysDatabaseLog искать все записи за последнюю минуту, у которых нужный TableId ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 13:57 | #2 |
Участник
|
Я как-то делал отчет, который из журнала базы данных достает историю изменения выбранных полей. Вроде довольно быстро работает на базе в 500 Гб. Правда там журнал базы данных хранился только за последние 2 недели, а потом обрезался.
А вам всего-то надо узнать какие записи изменились из списка нужных вам таблиц.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 14:29 | #3 |
Модератор
|
"Довольно быстро", или "достаточно быстро чтобы непрерывно делать это 10+ раз в минуту", учитывая других читателей-писателей в лог ?
__________________
-ТСЯ или -ТЬСЯ ? Последний раз редактировалось Vadik; 13.01.2021 в 14:53. |
|
13.01.2021, 15:37 | #4 |
Участник
|
Цитата:
А запрос к таблице SysDatabaseLog вроде быстро выполнялся. Прошло уже несколько лет с того времени. По-любому надо пробовать. По-моему это самый простой способ решить данную проблему. А начинать пробовать надо с простых способов. Хотя все-таки поймать изменение конкретного поля через таблицу SysDatabaseLog - задача не очень тривиальная, но пример как это сделать есть. Даже на этом форуме выкладывали.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 15:39 | #5 |
Участник
|
Запустил у себя сейчас такой джоб.
Для 26 тысяч клиентов он отработал примерно за 2 минуты (если убрать вывод в инфолог) Это для Аксапты версии 3.0 X++: static void sysDatabaseLogFieldChangedCustAxForum(Args _args) { CustTable custTable; SysDatabaseLog SysDatabaseLog; int i; container tmp; SysOperationProgress sysOperationProgress = new SysOperationProgress(1); int stepCount; int total; UserInfo UserInfo; ; select count(RecId) from custTable; total = custTable.RecId; sysOperationProgress.setTotal(total); while select custTable { stepCount ++; sysOperationProgress.setCount(stepCount); sysOperationProgress.setText(strFmt("%1 запись из %2", stepCount, total)); while select SysDatabaseLog order by createdDate, createdTime where SysDatabaseLog.LogRecId == custTable.RecId && SysDatabaseLog.table == custTable.TableId { if (typeOf(conpeek(SysDatabaseLog.Data, 1)) == Types::Container) { for ( i = 1; i <= conlen(SysDatabaseLog.data); i ++) { tmp = conpeek(SysDatabaseLog.Data, i ); if (fieldExt2Id(conpeek(tmp, 1)) == fieldnum(custTable, zResponsibleDivision)) { if(conpeek(tmp, 3) != conpeek(tmp, 2)) { select firstonly UserInfo where UserInfo.Id == SysDatabaseLog.createdBy; info(strfmt("%1 ~ %2 ~ %3 ~ %4 ~ %5", custTable.AccountNum, UserInfo.name, SysDatabaseLog.createdDate, conpeek(tmp, 3),conpeek(tmp, 2) )); } } } } } } }
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ Последний раз редактировалось Ace of Database; 13.01.2021 в 15:41. |
|
13.01.2021, 15:43 | #6 |
Участник
|
Т.е. 26000 вызовов select для таблицы SysDatabaseLog срабатывают за 2 минуты и плюс еще время на парсинг
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 15:48 | #7 |
Участник
|
В таблице SysDatabaseLog сейчас 74 миллиона записей. Похоже, что ее перестали обрезать
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
13.01.2021, 14:52 | #8 |
Участник
|
Цитата:
Цитата:
На худой конец можно создать свой лог-таблицу под эту задачу. У нас практикуется репликация о которой говорил axm2017. Цитата:
Если под эту задачу сделать свою таблицу, да с толковыми индексами, то будет очень быстро работать.
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 13.01.2021 в 15:00. |
|
Теги |
aif, ax2012, change tracking, интеграция, как правильно |
|
|