none
请教SQL 的一个问题。 RRS feed

  • 问题

  • 假如UserInfo表中存在多个字段,如ID,Name,Addr,Tel,ModiDate等,我想实现对某个指定字段(如Name)进行修改后更新ModiDate的日期。

    ModiDate不能设为timestamp型,因为除Name字段外其余字段进行修改后我不想更新ModiDate

    DML触发器似乎不能针对某个字段,只能针对整个表或视图。

    我想在SQL中实现,请教。


    never
    2011年9月20日 7:46

答案

  • 請參考以下程式碼,看看是否符合你的需求。

     

    use Northwind
    go
    
    --建立測試資料表
    if exists (select * from sys.objects where type = 'U' and name = 'UserInfo')
    	drop table UserInfo
    go
    
    create table UserInfo
    (
    ID varchar(10) primary key
    ,Name varchar(10)
    ,Addr varchar(10)
    ,Tel varchar(10)
    ,ModiDate datetime
    )
    go
    
    --建立測試資料
    insert into UserInfo values ('001','User1','Addr1','12345678',GETDATE())
    select * from UserInfo
    go
    
    --建立DML TRIGGER
    create trigger tr_UpdateUserInfo on dbo.UserInfo
    after UPDATE
    as
     --傳回一個布林值,用來指出是否在資料表或檢視的指定資料行上嘗試了
    --  INSERT 或 UPDATE。Transact-SQL INSERT 或 UPDATE 觸發程序主體內的任何位置,
    --都可以利用 UPDATE() 來測試觸發程序是否應該執行特定動作。
      if update(Name)
    	update UserInfo
    	set ModiDate = DATEADD(year,1,GETDATE())
    	where ID = (select ID from inserted)
    go	
    
    --更新address欄位ModiDate不會被更新
    update UserInfo
    set Addr = '123'
    where ID = '001'
    
    select * from UserInfo
    
    --更新Name欄位ModiDate被加了一年
    update UserInfo
    set Name  = 'User2'
    where ID = '001'
    
    select * from UserInfo
    
    
    

     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 jacky.joey 2011年9月20日 13:54
    2011年9月20日 13:26

全部回复

  • 触发器可以。

     

    for update的触发器

    然后检查那个字段更新了,如果这个字段是你要检查的字段,就update modidate字段。

     


    family as water
    2011年9月20日 8:39
  • 不太理解啊,能否给我个列子呢?谢谢
    never
    2011年9月20日 9:16
  • 請參考以下程式碼,看看是否符合你的需求。

     

    use Northwind
    go
    
    --建立測試資料表
    if exists (select * from sys.objects where type = 'U' and name = 'UserInfo')
    	drop table UserInfo
    go
    
    create table UserInfo
    (
    ID varchar(10) primary key
    ,Name varchar(10)
    ,Addr varchar(10)
    ,Tel varchar(10)
    ,ModiDate datetime
    )
    go
    
    --建立測試資料
    insert into UserInfo values ('001','User1','Addr1','12345678',GETDATE())
    select * from UserInfo
    go
    
    --建立DML TRIGGER
    create trigger tr_UpdateUserInfo on dbo.UserInfo
    after UPDATE
    as
     --傳回一個布林值,用來指出是否在資料表或檢視的指定資料行上嘗試了
    --  INSERT 或 UPDATE。Transact-SQL INSERT 或 UPDATE 觸發程序主體內的任何位置,
    --都可以利用 UPDATE() 來測試觸發程序是否應該執行特定動作。
      if update(Name)
    	update UserInfo
    	set ModiDate = DATEADD(year,1,GETDATE())
    	where ID = (select ID from inserted)
    go	
    
    --更新address欄位ModiDate不會被更新
    update UserInfo
    set Addr = '123'
    where ID = '001'
    
    select * from UserInfo
    
    --更新Name欄位ModiDate被加了一年
    update UserInfo
    set Name  = 'User2'
    where ID = '001'
    
    select * from UserInfo
    
    
    

     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 jacky.joey 2011年9月20日 13:54
    2011年9月20日 13:26
  • 谢谢~回答的相当详细,连图都上了,有空去你的blog踩踩。
    never
    2011年9月20日 13:55
  • 谢谢~回答的相当详细,连图都上了,有空去你的blog踩踩。
    never
    歡迎來互相交流。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年9月20日 14:15