C# отслеживание изменений в MySQL

304
27 октября 2017, 10:31

Здравствуйте, с недавнего времени знакомлюсь с С# и MySQL и столкнулся с задачей, которая как-то не освещается в интернетах, либо я подослеп и виноват. Но понять не могу.

Используется: VS 2015, Windows Forms + MySql.Data.MySqlClient

Задача: приложение-клиент отслеживает изменения таблице БД на сервере, и если произошли изменения (напр., добавлена запись), то происходит последовательность действий (напр., просто получение и вывод, ну в этом нет проблемы). Как при работе с MySQL базой реализуется такое отслеживание? К примеру, пока копал, нашел SqlDependency, через который подобное реализуется для MSSQL.

Первое, что приходит на ум - это самому описать поведение, чтобы клиент по таймеру бомбил БД запросом, допустим, предоставления последней записи и сравнивал со своей последней полученной записью (или сравнить TIMESTAMP или id и т.д.). Если идентичны - изменений не было, если отличаются - то загружаем. Но это не выглядит рационально. Это выглядит брутально).

Сейчас читаю про NET Connector на dev.mysql.com, но не могу подобного явно найти. Объясните, пожалуйста, есть ли какое-то стандартное решение?

Answer 1

Есть такой вариант:

1) Добавляем триггеры к таблицы, которые при INSERT, UPDATE, DELETE логируют изменения в отдельную таблицу.

CREATE TRIGGER articles_log_update AFTER update ON articles 
FOR EACH ROW BEGIN 
INSERT articles_logs (action, row_id, `date`) VALUES ("update", new.id, NOW()); 
END
CREATE TRIGGER articles_log_insert AFTER insert ON articles 
FOR EACH ROW BEGIN 
INSERT articles_logs (action, row_id, `date`) VALUES ("insert", new.id, NOW()); 
END
CREATE TRIGGER articles_log_delete AFTER delete ON articles 
FOR EACH ROW BEGIN 
INSERT articles_logs (action, row_id, `date`) VALUES ("delete", old.id, NOW());
END

2) Ставим задачу по крону, чтобы она запускалась каждый час (или день, неделю), дабы проверять таблицу логов и делать необходимые действия.

Однако сразу хочу сказать, что если это ваша база данных и вы ее проектируете, то не должны допускать, чтобы таблица в БД было связующим звеном между частям приложения. Взаимодействие между внутренними и внешними сервисами должно быть реализованно в рамках апишек и контрактов.

READ ALSO
Как в EF добавить таблицу?

Как в EF добавить таблицу?

Есть проэкт, понадобилось добавить в него таблицуВсё бы хорошо, только таблица не появляется в базе после того как делаю drop database, ну и понятно...

291
Отображение списочных данных в WinForms

Отображение списочных данных в WinForms

С С# я знаком относительно недавно, всегда занимался веб-программированием

219
Изменение кодировки текста в PDF файле

Изменение кодировки текста в PDF файле

Есть текстовые файлы с PCL разметкой, их необходимо перекодировать в PDFЕдинственная некоммерческая программа которую я нашел - ghostpcl, при...

196
Ошибка в асинхронном запросе

Ошибка в асинхронном запросе

Пытаюсь получить текущего работающего пользователя, через WMIНо происходит не понятная мне ошибка

202