最佳解答者
MCITP系列之Lewis’s gift time – 20070125- SQL Server 2005物件開發

問題
-
[活動方式]:
老師於課程結束當天在論壇上po出當天課程內容相關問題,在「2天內」大家皆可踴躍回答,老師會選取出最快且最完整的回答,將之標示為「正確答案」,得獎者老師會於下次課堂上公佈(當然你也可以在2天後上論壇查看自己是否有被特別標註為解答),認真的幸運兒可能就是你喔 : P
[注意事項]:
得獎者我們會查看你登入論壇的mail並寄信與您連絡,如果您等不到聯繫也可直接上論壇告知我們。
[Question]
3.請問如何利用請問如何利用觸發程序,將最近修改日、最近修改電腦、最近修改登入帳戶,自動記錄在被修改過的資料的(lstMfyDT、lstMfyPC、lstMfyLogin)欄位,假設的資料表如下?
CREATE TABLE Orders
( OrderID int not null primary key,
SalesAmt int,
lstMfyDT datetine, --記錄最後修改人,若是沒有修改為NULL
lstMfyPC nvarchar(256), --記錄最後修改前端電腦,若是沒有修改為NULL
lstMfyLogin nvarchar(256) --記錄最後修改登入者,若是沒有修改為NULL
)
解答
所有回覆
-
cc.sj 是利用After Trigger,
小弟利用INSTEAD OF UPDATE 撰寫
並加上CURSOR以避免意外狀況或另有each row BI資訊處理需求,無法正確記錄同一次被修改的記錄。
※當然還是可以不使用CURSOR. (performerce will be lower.)
CREATE TRIGGER IOU_Trig_UPD_Orders ON Orders
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ONDeclare @ii_OrderID int
Declare @ii_SalesAmt int
Declare @idt_updtime datetime
Declare @is_hostname nchar(255)
Declare @is_loginame nchar(255)
Declare @i_SalesAmt intDeclare cur_Ord_Trig_upd cursor local for
Select OrderID,SalesAmt
from Inserted;Open cur_Ord_Trig_upd;
Fetch Next From cur_Ord_Trig_upd Into @ii_OrderID,@ii_SalesAmt;
While (@@Fetch_Status=0)
BEGIN
select @idt_updtime = getdate(), @is_hostname = hostname, @is_loginame=loginame
from sys.sysprocesses
where spid= @@SPIDUPDATE O set SalesAmt = @ii_SalesAmt, lstMfyDT = @idt_updtime, lstMfyPC = @is_hostname,lstMfyLogin = @is_loginame
From Orders O
WHERE O.OrderID = @ii_OrderID
Fetch Next From cur_Ord_Trig_upd Into @ii_OrderID,@ii_SalesAmt;
End
Close cur_Ord_Trig_upd;
Deallocate cur_Ord_Trig_upd;END
/*以下為測試範例一*/insert into Orders (OrderID,SalesAmt) values (1,100)
insert into Orders (OrderID,SalesAmt) values (2,100)
insert into Orders (OrderID,SalesAmt) values (3,100)select * From Orders
Go
update Orders set SalesAmt = 99 where OrderID=1
Go
select * From Orders
Go
/*以下為測試範例二*/
select * From Orders
Go
update Orders set SalesAmt = 98 where OrderID=1
Go
select * From Orders
Go