想請教SQL Trigger記錄多個欄位值異動的寫法 |
答題得分者是:shpeng
|
ymkang
一般會員 發表:9 回覆:10 積分:3 註冊:2002-08-29 發送簡訊給我 |
因為翻書一直找不到
只好來此請教精通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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 1. 你的 Log Table 欄位設計可能不太恰當. 建議 :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有什麼特殊的寫法可以解決這個問題?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 |
shpeng
初階會員 發表:6 回覆:67 積分:49 註冊:2002-12-21 發送簡訊給我 |
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 發送簡訊給我 |
|
shpeng
初階會員 發表:6 回覆:67 積分:49 註冊:2002-12-21 發送簡訊給我 |
|
Akqj1098
一般會員 發表:14 回覆:60 積分:14 註冊:2002-05-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |