2008年2月22日

[mysql 14394] Re: データ更新の履歴


更新前のデータを履歴に残したいのだから、「BEFORE INSERT ON t」でなく、「BEFORE UPDATE ON t」になります。
更新前データは、「OLD.列名」で参照でき、更新後データは、「NEW.列名」で参照できます。


-- 表定義例
create table tbl1
(clm1 int primary key,

clm2 int,
clm3 varchar(10));
create table log_tbl1
(clm1 int,
clm2 int,
clm3 varchar(10),
upd_user varchar(30),
tmst timestamp);

-- トリガ定義例
delimiter // -- 終端記号を変更
create trigger upd_tbl1 before update on tbl1
for each row
begin
insert into log_tbl1(clm1,clm2,clm3,upd_user)
values(old.clm1,old.clm2,old.clm3,current_user);
end
;
//
delimiter ; -- 終端記号を元に戻す


-- テスト用データ格納例
insert into tbl1 values(1,0,'a');
insert into tbl1 values(2,0,'b');
insert into tbl1 values(3,0,'c');
insert into tbl1 values(4,0,'d');
insert into tbl1 values(5,0,'e');

-- 更新してみる
update tbl1
set clm2=clm2+1,clm3=concat(clm3,'x')
where clm1=3;

-- トリガの結果確認
select * from log_tbl1;


> Date: Fri, 22 Feb 2008 17:27:16 +0900
> From: alex_backspin@xxxxx
> Subject: [mysql 14393] Re: データ更新の履歴
> To: ml@xxxxx
>
> 近藤さま、
>
> 解答ありがとうございます。
>
> バージョンは5.0.22で、ubuntu 6.06.1 LTS にて使っています。
>
> トリガーを使用するとき、
>
> mysql> CREATE TRIGGER t_bi
> -> BEFORE INSERT ON t
> -> FOR EACH ROW
> -> INSERT INTO bk_table value ・・・?;
>
> 更新前のデータを別のテーブルにインサートするには、上記のような形となるの
> でしょうか?
> このとき、INSERT構文をどのように書けばよいのかご教授頂けませんでしょうか?
>
>
> nobu wrote:
>> 近藤です。
>>
>> MySQLのバージョンはいくつでしょうか?
>> MySQLに限ったことではありませんが、そのような要件の際に私はトリガー
>> を使用しています。MySQL5.0以上であればトリガーが使えたかと思います。
>>
>> 以上
>>
>>
>>
>> Alex さんは書きました:
>>> こんにちは、ALEXです。
>>>
>>> MySQLの任意のテーブル内のでデータを更新したとき、更新前のデータを自動的
>>> にどこかに保管するような仕組みはないものでしょうか。
>>> データが変更されたときの履歴を取りたいのが目的です。
>>> よろしくお願い致します。
>>>
>>>
>>
>>
>>
>

_________________________________________________________________
「脳内メーカー」の次は「鞄の中身メーカー」? Live Search で検索!
http://search.msn.co.jp/results.aspx?q=%E9%9E%84%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC&FORM=MGCEAA

投稿者 xml-rpc : 2008年2月22日 17:47
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/70178
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。