Алгоритм сравнения может работать, но он не будет быстрым в том смысле, что вам придется сканировать всю исходную базу данных для каждой синхронизации.
По сути, вы должны были бы сделать полное извлечение данных согласованным и стабильным способом (т. Е. Два таких извлечения без изменений дали бы одинаковый результат.)
Затем вы сравниваете это с предыдущим извлечением, которое вы сделали, и затем вы можете найти все изменения. Потребовалось бы что-то более умное, чем простой текстовый diff, чтобы определить, что строки были не просто удалены + вставлены, а фактически обновлены.
К сожалению, если нет способа спросить исходную базу данных о последних изменениях, как вы уже отмечали, из-за отсутствия временных меток или аналогичных механизмов, то я не понимаю, как можно улучшить ситуацию. чем полная выписка каждый раз.
Теперь я не так много знаю Sybase, но в MS SQL Server вы могли бы потенциально создать другую базу данных, которая отражает первую, и в этой второй базе данных вы могли бы внести любые необходимые изменения.
Однако, если вы можете создать такую базу данных в Sybase и использовать SQL для одновременного доступа к ним, вы сможете выполнять запросы, которые приводят к различиям.
Например, что-то вроде:
SELECT S.*
FROM sourcedb..sourcetable1 AS S
FULL JOIN clonedb..sourcetable1 AS C
ON S.pkvalue = C.pkvalue
WHERE S.pkvalue IS NULL OR C.pkvalue IS NULL
Это приведет к появлению строк, которые вставляются или удаляются.
Чтобы найти те, которые изменились, вам понадобится предложение WHERE:
WHERE S.column1 <> C.column1
OR S.column2 <> C.column2
OR ....
Поскольку таблицы объединяются, предложение WHERE отфильтровывает все строки, в которых предыдущий экстракт и текущее состояние отличаются.
Теперь, это может не работать быстро, вам нужно проверить, чтобы убедиться.