none
MCITP系列之Lewis’s gift time – 20070125- SQL Server 2005物件開發 RRS feed

  • 問題

  • [活動方式]

    老師於課程結束當天在論壇上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

      )

     

    2007年1月29日 上午 03:47

解答

  • CREATE TRIGGER tri_for_update ON Orders

     AFTER UPDATE

     AS

       UPDATE Orders SET lstMfyDT=GETDATE(),lstMfyPC=HOST_NAME(),lstMfyLogin=SUSER_SNAME() WHERE OrderID in (SELECT OrderID FROM inserted)

    GO

     

    2007年1月29日 下午 02:21

所有回覆

  • CREATE TRIGGER tri_for_update ON Orders

     AFTER UPDATE

     AS

       UPDATE Orders SET lstMfyDT=GETDATE(),lstMfyPC=HOST_NAME(),lstMfyLogin=SUSER_SNAME() WHERE OrderID in (SELECT OrderID FROM inserted)

    GO

     

    2007年1月29日 下午 02:21
  • 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 ON

    Declare @ii_OrderID int
    Declare @ii_SalesAmt int
    Declare @idt_updtime datetime
    Declare @is_hostname nchar(255)
    Declare @is_loginame nchar(255)
    Declare @i_SalesAmt int

     Declare 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= @@SPID

         UPDATE 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

    2007年1月29日 下午 02:25
  • CREATE TRIGGER [dbo].[TRIG_Orders] ON [dbo].[Orders] FOR UPDATE
     AS
       UPDATE [dbo].[Orders] SET lstMfyDT=GETDATE(), lstMfyPC=HOST_NAME(), lstMfyLogin=SUSER_SNAME()
         FROM [dbo].[Orders] O
         JOIN INSERTED I ON O.[OrderID]=I.[OrderID]
    2007年1月30日 上午 06:46