如何能更简洁的记录表历史

发表于:2012-1-17 09:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:雪雁    来源:51Testing软件测试网采编

  很多时候,都需要对数据表进行历史记录。比如每修改一次表单,之前的表单数据都需要计入历史。当表单比较多的时候,记录历史是一件比较麻烦的事情。又要建日志表,又要写存储过程,又要写页面逻辑等等。有没有通用点的办法呢?最近做项目时碰到了,要求每次审核、退回等操作时就要记录表历史。于是,作者就想到了以下方案。在此与大家分享了,如果有更合适的或合理的建议,请回复本帖。

  1)创建日志表

  一个一个建表是一件烦躁的事,而且还容易出错。那么,以下存储过程就能批量建表了,还添加了LogCreateDate、LogDefaultFlag、LogPTID这3个字段。值得注意的是,创建表结构可以用以下语句“SELECT * Into tableName_Log FROM tableName”。如果只需要复制表结构,那就插入一行,再删除就是。

  SQL里面实现遍历数据集不方便,不想用游标,于是采用了以下方式。具体存储过程如下:

  1. USE [NbShop]    
  2. GO    
  3. /****** Object:  StoredProcedure [dbo].[CreateLogTable]    Script Date: 07/02/2011 12:54:32 ******/    
  4. SET ANSI_NULLS ON   
  5. GO    
  6. SET QUOTED_IDENTIFIER ON   
  7. GO    
  8. -- =============================================   
  9. -- Author:      LWQ   
  10. -- Create date: 2011-6-29   
  11. -- Description: 创建日志表(命名规则:表名+_Log)   
  12. -- =============================================   
  13. ALTER PROCEDURE [dbo].[CreateLogTable]    
  14. AS   
  15. BEGIN   
  16.     -- SET NOCOUNT ON added to prevent extra result sets from   
  17.    -- interfering with SELECT statements.   
  18.     SET NOCOUNT ON;    
  19.      
  20.     -- Insert statements for procedure here   
  21.     -------------------创建日志表------------------------------   
  22. declare @rows     int   
  23. declare @n        int   
  24. declare @tableName        varchar(100)    
  25. select @n=1    
  26.     SELECT     name   
  27.     INTO            [#tempTables]    
  28.     FROM         sys.sysobjects    
  29.     WHERE     (xtype = 'U 'AND (name NOT IN ('sysdiagrams''T_BasicTime''T_Attribute''T_AttributeType''T_BasicTime''T_City','T_CompeteForMeasu',     
  30.                           'T_DocumentTypeRestrictions''T_FormRelevance''T_HistroyShopAction''T_Notice''T_NoticeReceive''T_Organize''T_OrgType',     
  31.                           'T_Province''T_Role''T_RptShopStatus''T_UploadFile''T_UrlPrint'))    
  32.                           AND (name NOT LIKE '%flow%'AND (name NOT LIKE '%Control%'AND    
  33.                           (name NOT LIKE '%Menu%'AND (name NOT LIKE '%Node%'AND (name NOT LIKE '%Log%'AND (name NOT LIKE '%Event%'AND (name NOT LIKE '%Object%'AND    
  34.                           (name NOT LIKE '%Process%'AND (name NOT LIKE '%ShopStatus%'AND (name NOT LIKE '%Task%')     
  35.                           AND (name NOT LIKE '%ThirdParty%'AND (name NOT LIKE '%User%')    
  36.                           AND (name NOT LIKE '%order%')    
  37.     Select * from   #tempTables    
  38.     Select name into #tempCurrent  from #tempTables    
  39.     Delete from  #tempCurrent    
  40.      
  41.     select @rows = @@rowcount    
  42.     while @n <= @rows   
  43.     begin   
  44.       set @tableName=(Select  top 1  name from #tempTables     
  45.       Where name not in    
  46.       (select name from #tempCurrent))    
  47.       if(@tableName is not null)    
  48.       begin   
  49.         insert into #tempCurrent values(@tableName)    
  50.         if object_id(@tableName+'_Log'is not null    
  51.         begin   
  52.             print   '表'+  @tableName +'已存在,仅做数据更新处理'   
  53.             exec ('INSERT INTO'+ @tableName +'_Log SELECT * FROM '+@tableName)                  
  54.         end   
  55.         else   
  56.         begin   
  57.             exec ('SELECT * Into '+@tableName+'_Log FROM '+@tableName)    
  58.             print   '表'+  @tableName +'创建成功'   
  59.             exec ('alter   table   '+@tableName+'_Log   add   LogCreateDate   datetime')    
  60.             exec ('alter   table   '+@tableName+'_Log   add   LogDefaultFlag   int')    
  61.             exec ('alter   table   '+@tableName+'_Log   add   LogPTID   varchar(32)')    
  62. ----            if   col_length( @tableName+' ',   'LogCreateDate ')   is not   null    
  63. ----            begin   
  64. ----                exec ('ALTER   TABLE   '+@tableName+'   DROP   COLUMN   LogCreateDate')    
  65. ----                print '删除'+@tableName+'的列LogCreateDate成功'   
  66. ----            end   
  67. ----            if(@tableName not in ('T_Shop','T_MeasurementAddress','T_TurnAround','T_IrisInstrumentHistory','T_ChainTurnApplication','T_TrainingNotice'))   
  68. ----            begin   
  69. ----                if   col_length( @tableName+' ',   'CreateDate ')   is not   null    
  70. ----                begin   
  71. ----                    exec ('ALTER   TABLE   '+@tableName+'   DROP   COLUMN   CreateDate ')   
  72. ----                    print '删除'+@tableName+'的列CreateDate成功'   
  73. ----                end    
  74. ----            end   
  75.         end   
  76.     end   
  77.         select @n = @n + 1    
  78.     end   
  79.     drop table  #tempCurrent    
  80.     drop table  #tempTables    
  81. -------------------创建日志表------------------------------   
  82. END

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号