3

私はMySqlでInnoDBエンジンを使用しています.テーブルが最後に変更された日時を知ることができるかどうかを調べようとしています(データであるか構造であるか)。

column update_timeInnoDBなのでinは使えません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 に答える