0

挿入と更新のユーザー ID とタイムスタンプを個別に取得することにより、行レベルの監査を実現しようとしています。しかし、何らかの理由で、更新に対しても挿入トリガーが起動し、2 つの insert_* 列が毎回更新されます (更新の場合も)。助けてください。

テーブル

create table test
(id varchar(30) primary key,
insert_id varchar(30),
insert_timestamp timestamp, 
update_id varchar(30), 
update_timestamp timestamp);

BEFORE INSERT トリガー

 DELIMITER //
    create trigger ins_test 
    before insert on test 
    for each row 
    Begin
    set new.insert_id = session_user();
    set new.insert_timestamp = now();
    End;
    //

BEFORE UPDATE トリガー

  DELIMITER //
    create trigger upd_test 
    before update on test 
    for each row 
    Begin
    set new.update_id = session_user();
    set new.update_timestamp = now();
    End;
    //

-ガネーシャ

4

1 に答える 1

0

SQL Fiddle で MySQL 5.5.30 のコードを試してみましたが、トリガーは正しく機能します。

挿入時にタイムスタンプ列をデフォルトで current_timestamp にしたくない場合は、タイムスタンプ列を明示的に NULL として定義する必要があります。

create table test
(
  id varchar(30) primary key,
  insert_id varchar(30) null,
  insert_timestamp timestamp null, 
  update_id varchar(30) null, 
  update_timestamp timestamp null
);

このSQL Fiddleを試して、トリガーが正しく機能していることを確認してください。各ステートメントの間に 1 秒間のスリープを追加したので、更新時に insert_timestamp が変更されないことがわかります。

于 2013-04-09T18:19:10.333 に答える