テーブル'table1'の変更を監視したいとします。
CREATE TABLE `table1` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`value` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=10;
上記は、自動インクリメントである「id」列を含む「table1」を作成するためのクエリです。
変更を保存するために別のテーブルを作成します。クエリを以下に示します
CREATE TABLE `changes` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`changes` VARCHAR(200) NULL DEFAULT '0',
`change_time` TIMESTAMP NULL DEFAULT NULL,
`tablename` VARCHAR(50) NULL DEFAULT NULL,
`changed_id` VARCHAR(10) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=21;
ここで、最初のテーブルにトリガーを作成します。つまり、'table1'クエリを以下に示します。
delimiter |
create trigger trg_table1 AFTER INSERT ON table1
FOR EACH ROW BEGIN
DECLARE lastid INT DEFAULT 0;
SELECT max(id) INTO lastid from table1;
insert into changes values(null,'insert',now(),'table1',lastid);
end;
|
delimiter ;
これで、「table1」に何かを挿入しようとすると、その詳細が変更テーブルに自動的に挿入されます。変更テーブルの変更は、変更のタイプを示します。つまり、insert、updateなどchange_timeは、変更が発生する時刻を示します。tablenameは、変更が発生するテーブルを示します。changed_idは、「table1」に新しく挿入された行のIDを示します。
次に、「changes」テーブルから継続的に読み取るJavaプログラムを作成します。'changes'テーブルの新しいエントリは、データベースに何かが起こったことを意味します。'changes'テーブルの各レコードから、挿入操作が行われたテーブルを理解できます。そして、これに基づいて、適切なアクションを実行できます。適切な操作を実行した後、その行を「変更」テーブルから削除します。
データベース内のテーブルごとにトリガーを作成できます(上記のように)...'changes'テーブルの'tablename'列から、どのテーブルで挿入が発生したかを理解できます。