SyBase SQL где-нибудь проверяет, нужна ли синхронизация?
У меня есть база данных Sybase SQL Anywhere 11.0.1, которую я использую для синхронизации с консолидированной базой данных Oracle.
Я знаю, что база данных SQL Anywhere отслеживает все изменения, внесенные в нее, чтобы она знала, что синхронизировать с консолидированной базой данных. Мой вопрос заключается в том, существует ли команда SQL, которая сообщит вам, есть ли в базе данных изменения для синхронизации.
У меня есть мобильное приложение, и я хочу показывать пользователю маленький флажок каждый раз, когда они вносят изменения в контроллер, которые необходимо синхронизировать. Я мог бы просто создать другую таблицу для отслеживания этих вещей самостоятельно, но я бы предпочел просто проверить связь с базой данных и спросить, есть ли в ней изменения, которые необходимо синхронизировать.
3 ответа
Там нет ничего автоматического, чтобы сказать вам, что есть данные для синхронизации. В дополнение к предложению Бена, другой идеей будет запрос таблицы SYS.SYSSYNC в удаленной базе данных, чтобы получить представление о возможных изменениях. Следующий оператор возвращает набор результатов, который показывает простой статус вашей последней синхронизации:
select ss.site_name, sp.publication_name, ss.log_sent,ss.progress
from sys.syssync ss, sys.syspublication sp
where ss.publication_id = sp.publication_id
and ss.publication_id is not null
and ss.site_name is not null
Если progress < log_sent
, то статус последней синхронизации неизвестен. Последняя загрузка может или не может быть применена в консолидированной, потому что загрузка была отправлена, но от сервера MobiLink не было получено никакого ответа. В этом случае предложение синхронизации не является плохой идеей.
Если progress = log_sent
, тогда последняя синхронизация прошла успешно. Зная это, вы можете проверить значение db_property('CurrentRedoPos')
, который будет возвращать текущее смещение журнала удаленной базы данных. Если это значение значительно выше, чем значение хода выполнения, со времени последней синхронизации к базе данных было применено много операций, поэтому есть хороший шанс, что есть данные для синхронизации. Есть много причин, почему даже большая разница в прогрессе и db_property('CurrentRedoPos')
может привести к тому, что фактические данные не нуждаются в синхронизации.
- Загрузка с сервера ML применяется dbmlsync после того, как значение прогресса на удаленном сервере обновляется dbmlsync, когда загрузка подтверждается сервером ML. Операции, примененные при загрузке dbmlsync, не синхронизируются обратно с ML-сервером, поэтому весь диапазон смещений может быть только последней примененной загрузкой. Это можно обойти, отслеживая текущее смещение журнала в
sp_hook_dbmlsync_end
перехватить, когда значение кода выхода в#hook_dict
Значение таблицы равно нулю. Это сообщит вам смещение журнала базы данных после применения загрузки, и теперь вы можете сравнить сохраненное значение с текущим смещением журнала. - Все операции в журнале транзакций могут быть операциями над таблицами, которые не синхронизированы.
- Все операции в журнале транзакций могли быть отменены.
Мое решение не идеальное. Самостоятельное отслеживание изменений в синхронизированных таблицах - это лучшее решение, но я подумал, что могу предложить альтернативу, которая подойдет для ваших нужд, с тем преимуществом, что вы не запускаете дополнительное действие для каждой операции, выполняемой над синхронизированной таблицей.
Мобильная база данных не отслеживает дату последней синхронизации, сервер MobiLink сохраняет всю эту информацию в таблицах MobiLink консолидированной базы данных.
Поскольку синхронизация только передает необходимую информацию, вы можете просто инициировать синхронизацию. Если синхронизировать нечего, ваше приложение будет использовать очень мало данных.
В качестве примечания, SQL Anywhere имеет собственный SO-клон, который контролируется инженерами Sybase. Если кто-нибудь знает наверняка, это будут они.
Начиная с SQL Anywhere 17, SAP PM сопоставляется с локальной базой данных Sybase, содержащей таблицу TTRANSACTION_UPLOAD, поэтому для определения необходимости синхронизации мы просто запрашиваем эту таблицу, чтобы узнать, есть ли у нее какие-либо записи, которые необходимо синхронизировать с HANA консолидация базы данных.