LoginSignup
4
2

More than 5 years have passed since last update.

テーブルのinsert/updateログをtriggerで簡単実装する

Posted at

テーブルに対する登録/更新処理のログをトリガーを使って残そうと思います。
でも「どのカラムの値を残そうかなぁ」とか考えるのが面倒なので、
完全なコピーのログをとろうと思います。
これをかんたんに実装するコードです。

    //サンプルテーブル sample_user をつくる
    $db->query('DROP TABLE IF EXISTS sample_user');
    $db->query('
    CREATE TABLE `sample_user` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(255) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      `created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY(id)   
    ) ENGINE=MyISAM;
    ');

    //ログ用テーブル _sample_user を sample_user から簡単につくる
    $db->query('DROP TABLE IF EXISTS _sample_user');
    //こうすると primary key や unique 属性を排除してテーブル生成できる
    $db->query('CREATE TABLE _sample_user as SELECT * FROM sample_user LIMIT 0');
    //更新日を記録するカラムを追加する
    $db->query('ALTER TABLE _sample_user ADD _created TIMESTAMP NOT NULL');

    //INSERT, UPDATE時に、_sample_tableへの挿入処理を行う
    $db->query("DROP TRIGGER IF EXISTS insert_sample_user");
    $db->query("DROP TRIGGER IF EXISTS update_sample_user");
    $query1 = "CREATE TRIGGER insert_sample_user AFTER INSERT ON sample_user ";
    $query2 = "CREATE TRIGGER update_sample_user AFTER UPDATE ON sample_user ";
    $query3 = "FOR EACH ROW 
           BEGIN
              INSERT IGNORE INTO _sample_user (SELECT *, NOW() FROM sample_user WHERE id = NEW.id);
           END;";
    $db->query($query1 . $query3);
    $db->query($query2 . $query3);

これで、insert/updateのたびに完全なコピーログを、日付つきで残していくことができます。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2