Как упомянул emc211 (хотя и не совсем показанный в примере), подход в RDB состоит в том, чтобы иметь пользовательскую функцию обновления, которая отфильтровывает неверные данные.
Если плохие данные изолированы для определенной таблицы:
upd:{if[x<>`badTableName;x insert y]};
Если плохие данные содержатся в «хорошей» таблице:
upd:{$[x=`goodTable;x insert select from ($[1<count first y;flip;enlist][cols[x]!y]) where notBadData;x insert y]};
Затем воспроизвестииспользуя -11!
и сохраненный.
В конечном итоге вы, вероятно, захотите сохранить очищенный файл журнала на случай, если вам когда-нибудь понадобится повторить его в будущем.Чтобы сделать это, вы можете использовать функцию обновления, аналогичную приведенной выше, за исключением того, что вместо вставки данных в память вы записываете хорошие записи обратно в новый файл журнала в соответствии с
q)L:`:/path/to/cleansedLogFile;
q).[L;();:;()];
q)lh:hopen L;
upd:{if[x<>`badTableName;lh enlist (`upd;x;y)]};
upd:{$[x=`goodTable;lh enlist (`upd;x;value flip select from ($[1<count first y;flip;enlist][cols[x]!y]) where notBadData);lh enlist (`upd;x;y)]};
, а затем снова воспроизводите, используя -11!
и когда завершено hclose lh
.