線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3808
推到 Plurk!
推到 Facebook!

想請教SQL Trigger記錄多個欄位值異動的寫法

答題得分者是:shpeng
ymkang
一般會員


發表:9
回覆:10
積分:3
註冊:2002-08-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-27 16:45:40 IP:61.218.xxx.xxx 未訂閱
因為翻書一直找不到 只好來此請教精通SQL的高手,希望各位前輩們能不吝幫小弟解決這個難題 假設現在有一Table: create table employee ( id int identity(10,1), emp_name varchar(20), emp_address varchar(50), emp_phone char(20), : (好多column) : primary key (id) ) 現在想利用Trigger把employee資料表每個欄位有update過的值記錄到 create table modify_log ( items int identity(10,1), login_user_name varchar(30), --登錄SQL使用者名稱 modify_column_name varchar(20), --異動欄位名稱 old_value varchar(20), --異動前欄位值 new_value varchar(20), --異動後欄位值 updatetime datetime, --異動時間 primary key (items) ) 該怎麼作呢? 如果是以下的寫法 create trigger tri_updatedata on employee for update as if update(欄位名稱) begin insert into modify_log values(.....) end 那如我有十幾個欄位該怎麼辦?
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-27 20:18:28 IP:218.32.xxx.xxx 未訂閱
1. 你的 Log Table 欄位設計可能不太恰當. 建議 :
create table modify_log
(
login_user_name varchar(30), --登錄SQL使用者名稱
ztype varchar(1), -- 'I': New Value; 'D': Old Value
id int , -- as employee table
emp_name varchar(20),
emp_address varchar(50),
emp_phone char(20),
:
(好多column)
:
1.在 Trigger 中, 有 'inserted' 及 'deleted' 兩個暫存 Table, deleted 是 update 前值, inserted 是 update 後值. 2.可用 INSERT INTO modify_log SELECT ..'D',* FROM deleted 及 INSERT INTO modify_log SELECT ..'I',* FROM inserted
ymkang
一般會員


發表:9
回覆:10
積分:3
註冊:2002-08-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-28 09:44:32 IP:61.222.xxx.xxx 未訂閱
引言: 1. 你的 Log Table 欄位設計可能不太恰當. 建議 :
create table modify_log
(
login_user_name varchar(30), --登錄SQL使用者名稱
ztype varchar(1), -- 'I': New Value; 'D': Old Value
id int , -- as employee table
emp_name varchar(20),
emp_address varchar(50),
emp_phone char(20),
:
(好多column)
:
1.在 Trigger 中, 有 'inserted' 及 'deleted' 兩個暫存 Table, deleted 是 update 前值, inserted 是 update 後值. 2.可用 INSERT INTO modify_log SELECT ..'D',* FROM deleted 及 INSERT INTO modify_log SELECT ..'I',* FROM inserted
Sorry,我好像沒有把問題的重點表達的很清楚 因為現在我想記錄每個欄位值異動的情形 比如說user利用update指令只修改了emp_name和emp_phone兩個欄位的值 那麼我想把emp_name及emp_phone欄位異動前及異動後的值記錄在log table ex:(in log table) index col_name old_value new_value 1. emp_name mary john 2. emp_phone 1234567 7654321 那現在我的trigger可以針對某個欄位異動的情形作記錄 但是無法記錄到多個欄位異動的情形 還是trigger有什麼特殊的寫法可以解決這個問題?
shpeng
初階會員


發表:6
回覆:67
積分:49
註冊:2002-12-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-28 10:22:37 IP:61.219.xxx.xxx 未訂閱
ymkang你好 其實您的問題是可以解的 只是比較麻煩
DECLARE @TableName VArchar(20)
DECLARE @TSQL NVarChar(4000)
SET @TableName = 'Employees'
SELECT  @TSQL = IsNULL(@TSQL,N'') 'IF UPDATE(' name ') INSERT log_table(''' name ''',old_value,new_value) VALUES (''' name ''',deleted.' name ',Inserted.' name ')' char(13) FROM  syscolumns where id = (select Id from sysobjects where name = @TableName)
PRINT @TSQL
--exec sp_executesql @TSQL
------
==取之於斯,用之於斯==
ymkang
一般會員


發表:9
回覆:10
積分:3
註冊:2002-08-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-30 09:34:58 IP:61.222.xxx.xxx 未訂閱
原來SQL可以這樣寫 真是神乎其技
shpeng
初階會員


發表:6
回覆:67
積分:49
註冊:2002-12-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-30 11:48:23 IP:61.219.xxx.xxx 未訂閱
過獎了 ==取之於斯,用之於斯==
------
==取之於斯,用之於斯==
Akqj1098
一般會員


發表:14
回覆:60
積分:14
註冊:2002-05-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-15 14:33:53 IP:211.23.xxx.xxx 未訂閱
哇~~~好猛 不知道能不能改寫到Oracle上面 
系統時間:2024-04-29 12:59:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!