MySql: знать дату последнего изменения таблицы - PullRequest
3 голосов
/ 06 сентября 2011

Я использую движок InnoDB в MySql и пытаюсь выяснить, возможно ли узнать дату и время последнего изменения таблицы (будь то данные или структура).

Поскольку это InnoDB, я не могу использовать column update_time в information_schema. Tables, так как там ничего не зарегистрировано. Производительность information_schema с большим количеством данных в любом случае дрянная, так что нет больших потерь.

Я думал об использовании триггера, который вставлял бы дату в самодельную таблицу «метаданных» при внесении изменений, но MySql не поддерживает триггеры DDL (операторы Create, Alter и Drop), поэтому это тоже не работает.

У меня вроде нет идей, есть какие-нибудь советы?

Спасибо

Редактировать: Я забыл указать, что данные о дате и времени будут извлекаться (через веб-сервис) разрабатываемым приложением Silverlight.

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

1 Ответ

0 голосов
/ 06 сентября 2011

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

пример

при вставке записано

CREATE TRIGGER emp_insert AFTER Insert ON hs_hr_employee FOR EACH ROW BEGIN
INSERT INTO hs_hr_audit (audit_table_name, audit_row_pk, audit_field_name, audit_old_value, audit_new_value,audit_datetime,audit_user,audit_description) VALUES ( "hs_hr_employee", NEW.emp_number, null, null, null,NOW(),@user,"new record added");
END;

для обновления tabel

CREATE TRIGGER emp_update AFTER UPDATE ON hs_hr_employee FOR EACH ROW BEGIN IF NOT( OLD.emp_number <=> NEW.emp_number) THEN INSERT INTO hs_hr_audit (audit_table_name, audit_row_pk, audit_field_name, audit_old_value, audit_new_value,audit_datetime,audit_user,audit_description) VALUES ( "hs_hr_employee", OLD.emp_number, "emp_number", OLD.emp_number, NEW.emp_number,NOW(),@user,"record updated"); END IF;
IF NOT( OLD.employee_id <=> NEW.employee_id) THEN INSERT INTO hs_hr_audit (audit_table_name, audit_row_pk, audit_field_name, audit_old_value, audit_new_value,audit_datetime,audit_user,audit_description) VALUES ( "hs_hr_employee", OLD.emp_number, "employee_id", OLD.employee_id, NEW.employee_id,NOW(),@user,"record updated"); END IF;
IF NOT( OLD.emp_lastname<=> NEW.emp_lastname) THEN INSERT INTO hs_hr_audit (audit_table_name, audit_row_pk, audit_field_name, audit_old_value, audit_new_value,audit_datetime,audit_user,audit_description) VALUES ( "hs_hr_employee", OLD.emp_number, "emp_lastname", OLD.emp_lastname, NEW.emp_lastname,NOW(),@user,"record updated"); END IF;
IF NOT( OLD.emp_firstname <=> NEW.emp_firstname) THEN INSERT INTO hs_hr_audit (audit_table_name, audit_row_pk, audit_field_name, audit_old_value, audit_new_value,audit_datetime,audit_user,audit_description) VALUES ( "hs_hr_employee", OLD.emp_number, "emp_firstname", OLD.emp_firstname, NEW.emp_firstname,NOW(),@user,"record updated"); END IF;

выполните поиск по контрольному журналу в Google для получения более подробной информации

...