3

我在 MySql 中使用 InnoDB 引擎,我试图弄清楚是否有可能知道上次修改表的日期时间(无论是数据还是结构)。

因为它是 InnoDB,所以我不能使用column update_timein information_schemaTables因为那里没有记录任何内容。information_schema无论如何,大量数据的性能很糟糕,所以没有大的损失。

我考虑过使用一个触发器,在进行修改时将日期插入到自制的“元数据”表中,但是 MySql 不支持 DDL 触发器(Create、Alter 和 Drop 语句),所以这也行不通.

我的想法有点用完了,有什么建议吗?

谢谢

编辑:我忘了指定这个日期时间数据将由我正在开发的 Silverlight 应用程序检索(通过 Web 服务)。

提供更多背景信息:我的 Web 服务上有一个方法,它返回数据库的结构及其数据。根据大小,这可能是一个相对较长的操作,因为我必须在information_schema表中获取外键信息。所以我只想在数据或结构发生变化时查询数据库。

4

1 回答 1

0

好的,您可以通过为表创建触发器来使用审计跟踪

例子

插入记录时

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;

用于更新表

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 上对审计跟踪进行一些搜索以获取更多详细信息

于 2011-09-06T14:56:17.613 回答