Разрешает ли MySQL обратные вызовы в C, чтобы при изменении я мог получать уведомления? - PullRequest
3 голосов
/ 14 апреля 2011

Разрешает ли MySQL обратные вызовы в C, чтобы при изменении в базе данных, например вставке, выполняемой другой программой или пользователем в командной строке, я мог получать уведомления?Я предполагаю, что это не так, потому что mysqlclient - это библиотека, а не запущенный поток.Но я могу также спросить.

Ответы [ 4 ]

4 голосов
/ 15 апреля 2011

Создайте триггер вот так.

DELIMITER $$

CREATE TRIGGER ad_mytable_each AFTER DELETE ON MyTable FOR EACH ROW
BEGIN
  #write code that trigger After delete (hence the "ad_" prefix)
  #For table MyTable (The _MyTable_ middle)
  #On each row that gets inserted (_each suffix)
  #
  #You can see the old delete values by accesing the "old" virtual table.
  INSERT INTO log VALUES (old.id, 'MyTable', old.field1, old.field2, now());

END$$

DELIMITER ;

Есть триггеры для INSERT, DELETE, UPDATE
И они могут запустить BEFORE или AFTER действие.
Триггер BEFORE действия может отменить действие, вызвав ошибку, например так.

CREATE TRIGGER bd_mytable_each BEFORE DELETE ON MyTable FOR EACH ROW
BEGIN
  #write code that trigger Before delete (hence the "db_" prefix)
  declare DoError Boolean; 

  SET DoError = 0;

  IF old.id = 1 THEN SET DoError = 1; END IF; 

  IF (DoError = 1) THEN SELECT * FROM Table_that_does_not_exist_to_force_error;
  #seriously this example is in the manual.

END$$

DELIMITER ;

Это предотвратит удаление записи 1.

A перед обновлением Триггер может даже изменить обновленные значения.

CREATE TRIGGER bu_mytable_each BEFORE UPDATE ON MyTable FOR EACH ROW
BEGIN
  IF new.text = 'Doon sucks' THEN SET new.text = 'Doon rules';
END$$

DELIMITER ;

Надеюсь, вы будете счастливы.

2 голосов
/ 14 апреля 2011

Триггеры MySQL позволяют вам подключаться к запросам вставки / обновления / удаления и делать что-то дополнительное. Вы можете занести их в отдельную таблицу, например.

1 голос
/ 29 августа 2012

Можно использовать триггеры в сочетании с UDF (пользовательские функции), чтобы соответствующее действие над базой данных выполняло триггер, который вызывает функцию C / C ++.

Просто учтите, что этот механизм запускает ваш код внутри процесса сервера mysql, а не на стороне клиента.

1 голос
/ 14 апреля 2011

Хорошо, вы можете прикрепить триггер к пользовательской функции и вызвать ее для вызова внешней программы, которая затем уведомит ваш код.

http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html#qandaitem-B-5-1-10

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...