MySQLで特定テーブルの変更を記録する場合、トリガーを活用する方法が有効です。以下に実装手順を示します:
1. 監査ログテーブルの作成
変更記録用のテーブルを作成します:
CREATE TABLE product_audit (
log_id INT AUTO_INCREMENT PRIMARY KEY,
action_type ENUM('追加', '更新', '削除'),
previous_values JSON,
current_values JSON,
changed_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- log_id: ログの一意識別子
- action_type: 操作種別(追加/更新/削除)
- previous_values: 変更前データ(更新/削除時)
- current_values: 変更後データ(追加/更新時)
- changed_time: 変更発生時刻
2. トリガーの実装
対象テーブル(例:product)の変更を監視するトリガーを作成します。
データ追加用トリガー
DELIMITER //
CREATE TRIGGER product_insert_trigger
AFTER INSERT ON product
FOR EACH ROW
BEGIN
INSERT INTO product_audit (action_type, current_values)
VALUES ('追加', JSON_OBJECT('product_id', NEW.product_id, 'name', NEW.product_name));
END //
DELIMITER ;
データ更新用トリガー
DELIMITER //
CREATE TRIGGER product_update_trigger
AFTER UPDATE ON product
FOR EACH ROW
BEGIN
INSERT INTO product_audit (action_type, previous_values, current_values)
VALUES (
'更新',
JSON_OBJECT('product_id', OLD.product_id, 'name', OLD.product_name),
JSON_OBJECT('product_id', NEW.product_id, 'name', NEW.product_name)
);
END //
DELIMITER ;
データ削除用トリガー
DELIMITER //
CREATE TRIGGER product_delete_trigger
AFTER DELETE ON product
FOR EACH ROW
BEGIN
INSERT INTO product_audit (action_type, previous_values)
VALUES ('削除', JSON_OBJECT('product_id', OLD.product_id, 'name', OLD.product_name));
END //
DELIMITER ;
3. 動作検証方法
テスト操作を実行後、ログテーブルを確認します:
-- 新規追加
INSERT INTO product (product_id, product_name) VALUES (1001, 'サンプル商品');
-- 情報更新
UPDATE product SET product_name = '更新商品' WHERE product_id = 1001;
-- 商品削除
DELETE FROM product WHERE product_id = 1001;
-- ログ確認
SELECT * FROM product_audit;
4. 運用上の注意点
- パフォーマンス影響:高頻度更新テーブルでは処理負荷が増大
- トランザクション整合性:ログ記録は元のトランザクションと同期
- デバッグ:トリガー動作不良時は定義内容とテーブル構造を再確認