MySQLトリガーを用いたテーブル変更履歴の記録方法

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. 運用上の注意点

  • パフォーマンス影響:高頻度更新テーブルでは処理負荷が増大
  • トランザクション整合性:ログ記録は元のトランザクションと同期
  • デバッグ:トリガー動作不良時は定義内容とテーブル構造を再確認

タグ: MySQL Trigger 変更ログ 監査ログ データベース監視

7月18日 00:23 投稿