SQL 数据表变化追踪

本文通过创建触发器展示了如何在SQL中追踪数据表的修改,包括哪些列被更新,并提供了详细的示例代码,演示了如何打印出具体修改的列名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 看到这个例子,记录下,共享。

 

---------------------------------------------------------------------------

--------------------------------------
参考 
  
  用触发器判断那些列被修改了,得被修改的列名(例子) 
  
  
  
  很多人发短信问这个问题,我不想一一作答。     
  columns_updated()可能联机帮助上说不大清楚。我写个例子放在这儿。     
  对大部份人来说很简单,但就是有好多人问相同的问题。     
  我以前发过,原贴找不着了,好在有保存,现重贴。     
    
  create     table     t     (         
                Col01     int     ,     Col02     int     ,     Col03     int     ,     Col04     int     ,     
                Col05     int     ,     Col06     int     ,     Col07     int     ,     Col08     int     ,     
                Col09     int     ,     Col10     int     ,     Col11     int     ,     Col12     int     ,     
                Col13     int     ,     Col14     int     ,     Col15     int     ,     Col16     int     ,     
                Col17     int     
  );     
  go     
  insert     into     t     values     (     
                1     ,     2     ,     3     ,     4     ,     5     ,     6     ,     7     ,     8     ,     9     ,     10     ,     11     ,     12     ,     13     ,     14     ,     15     ,     16     ,     17     
  );     
  go     
  create     trigger     tri_test     on     t     for         
  update     
  as     
  begin     
      declare     @i     int     
      select     @i=count(*)     from     syscolumns     where     id=object_id('t')     
      while     @i>0     
      begin     
          if     substring(     columns_updated()     ,     (@i-1)/8+1     ,     1     )     &     power(     2,     (@i-1)%8     )     >     0     
          print     '第'+rtrim(@i)+'列修改'     
          set     @i=@i-1     
      end     
  end     
  go     
  update     t     set     col17=1,col15=1,col16=1,col14=1,col09=1,col11=1,col01=1,col02=1,col03=1     
  go     
  /*     
  结果:     
  第17列修改     
  第16列修改     
  第15列修改     
  第14列修改     
  第11列修改     
  第9列修改     
  第3列修改     
  第2列修改     
  第1列修改     
  */     
    
    
  --修改一下方式:     
  alter     trigger     tri_test     on     t     for         
  update     
  as     
  begin     
      declare     @i     int     
      select     @i=count(*)     from     syscolumns     where     id=object_id('t')     
      while     @i>0     
      begin     
          if     substring(     columns_updated()     ,     (@i-1)/8+1     ,     1     )     &     power(     2,     (@i-1)%8     )     >     0     
          print     '列"'+col_name(object_id('t'),@i)+'"修改'     
          set     @i=@i-1     
      end     
  end     
    
  go     
    
  update     t     set     col17=1,col15=1,col16=1,col14=1,col09=1,col11=1,col01=1,col02=1,col03=1     
  /*     
  结果:     
  列"Col17"修改     
  列"Col16"修改     
  列"Col15"修改     
  列"Col14"修改     
  列"Col11"修改     
  列"Col09"修改     
  列"Col03"修改     
  列"Col02"修改     
  列"Col01"修改     
  */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值