日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何能更簡潔的記錄表歷史

很多時候,都需要對數(shù)據(jù)表進行歷史記錄。比如每修改一次表單,之前的表單數(shù)據(jù)都需要計入歷史。當表單比較多的時候,記錄歷史是一件比較麻煩的事情。又要建日志表,又要寫存儲過程,又要寫頁面邏輯等等。有沒有通用點的辦法呢?最近做項目時碰到了,要求每次審核、退回等操作時就要記錄表歷史。于是,作者就想到了以下方案。在此與大家分享了,如果有更合適的或合理的建議,請回復本帖。

目前成都創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)絡空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設計、東平網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1)創(chuàng)建日志表

一個一個建表是一件煩躁的事,而且還容易出錯。那么,以下存儲過程就能批量建表了,還添加了LogCreateDate、LogDefaultFlag、LogPTID這3個字段。值得注意的是,創(chuàng)建表結(jié)構(gòu)可以用以下語句“SELECT * Into tableName_Log FROM tableName”。如果只需要復制表結(jié)構(gòu),那就插入一行,再刪除就是。

SQL里面實現(xiàn)遍歷數(shù)據(jù)集不方便,不想用游標,于是采用了以下方式。具體存儲過程如下:

 
 
 
  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: 創(chuàng)建日志表(命名規(guī)則:表名+_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.     -------------------創(chuàng)建日志表------------------------------  
  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 +'已存在,僅做數(shù)據(jù)更新處理' 
  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 +'創(chuàng)建成功' 
  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. -------------------創(chuàng)建日志表------------------------------  
  82. END 

#p#

2)刪除日志表

在開發(fā)過程中,難免會對字段進行更改。于是刪除的存儲過程也得有。具體代碼如下:

 
 
 
  1. USE [NbShop]
  2. GO
  3. /****** Object:  StoredProcedure [dbo].[DropLogTable]    Script Date: 07/02/2011 12:54:29 ******/
  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].[DropLogTable]
  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. declare @rowsIndex     int
  21. declare @nIndex        int
  22. declare @LogTableName        varchar(100)
  23. select @nIndex=1
  24.     SELECT     name
  25.     INTO            #LogtempTables
  26.     FROM         sys.sysobjects
  27.     WHERE     (xtype = 'U ') AND (name like '%\_log' escape '\')  
  28.     Select * from #LogtempTables
  29.     Select name into #LogtempCurrent  from #LogtempTables
  30.     Delete from  #LogtempCurrent
  31.     select @rowsIndex = (Select count(*) from   #LogtempTables)
  32.     print   @rowsIndex
  33.     
  34. while @nIndex <= @rowsIndex
  35. begin
  36.   set @LogTableName=(Select  top 1  name from #LogtempTables 
  37.   Where name not in 
  38.   (select name from #LogtempCurrent))
  39.   if(@LogTableName IS NOT NULL)
  40.   begin
  41.     insert into #LogtempCurrent values(@LogTableName)
  42.     print     'Drop table '+@LogTableName
  43.     exec ('Drop table '+@LogTableName)
  44.     print    '刪除'+@LogTableName+'成功'
  45.   end
  46.  
  47.   select @nIndex = @nIndex + 1
  48. end
  49. Drop table   #LogtempTables
  50. Drop table   #LogtempCurrent
  51. SELECT     name FROM         sys.sysobjects     WHERE     (xtype = 'U ') AND (name like '%\_log' escape '\') 
  52. -------------------刪除日志表------------------------------
  53. END

以上語句值得注意的是在查找以“_Log”結(jié)尾的表名的搜索條件,需要加上“escape '\'”。

3)記錄日志

日志表有了,還得記錄日志呢。為每個表寫個存儲過程會過于繁瑣,而且改動了就得跟著改動。就是碼農(nóng)也吃不消。于是有了以下存儲過程,該存儲過程定義了7個參數(shù),允許傳入存儲過程、表名、Where條件等。具體如下:

 
 
 
  1. USE [NbShop]
  2. GO
  3. /****** Object:  StoredProcedure [dbo].[RecordLog]    Script Date: 07/02/2011 12:54:07 ******/
  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: 記錄日志
  12. -- =============================================
  13. ALTER PROCEDURE   [dbo].[RecordLog]
  14.     @ObjectID varchar(32),                      ---門店ID
  15.     @TableName varchar(100),                    ---表名
  16.     @PTID varchar(32),                          ---PTID(階段ID),可選
  17.     @PhasesID varchar(32),                      ---階段ID,可選
  18.     @ProcedureName varchar(200),                ---存儲過程名稱,可選
  19.     @InsertSQLWhere nvarchar(1000),                 ---主表的篩選條件
  20.     @UpdateSQLWhere nvarchar(1000)                  ---主表的篩選條件
  21. AS
  22. BEGIN
  23.     -- SET NOCOUNT ON added to prevent extra result sets from
  24.     -- interfering with SELECT statements.
  25.     SET NOCOUNT ON;
  26.     
  27.     IF (@ProcedureName is not NULL)
  28.     BEGIN
  29.         exec ('exec('+@ProcedureName+''''+@ObjectID+''','''+@PTID+''','''+@PhasesID+''')')
  30.     END
  31.     ELSE IF(@InsertSQLWhere IS NOT NULL)
  32.     BEGIN
  33.         IF(@UpdateSQLWhere IS NOT NULL)
  34.         Begin
  35.             exec('Update '+ @tableName +'_Log Set LogDefaultFlag=0 ' +@UpdateSQLWhere)
  36.         End
  37.         Else
  38.         Begin
  39.             declare @UpdateExecSQL nvarchar(2000)
  40.             Select @UpdateExecSQL='Update '+    @tableName +'_Log Set LogDefaultFlag=0 Where '
  41.             --------------判斷是否存在ObjectID列(門店ID)-----------------------------
  42.             if @ObjectID IS NOT NULL AND col_length( @tableName+' ',   'ObjectID ')   is not   null 
  43.             BEGIN
  44.                 Select @UpdateExecSQL=@UpdateExecSQL+' ObjectID='''+@ObjectID+''' '
  45.             END     
  46.             Else
  47.             Begin
  48.                 Select @UpdateExecSQL=@UpdateExecSQL+' ShopID='''+@ObjectID+''' '
  49.             END
  50.             exec(@UpdateExecSQL)
  51.         END
  52.         exec('INSERT INTO '+    @tableName +'_Log SELECT *,getdate(),1,'''+@PTID+''' FROM '  + @tableName+' '+@InsertSQLWhere)
  53.     END
  54.     ELSE
  55.     BEGIN
  56.         declare @InsertSQL nvarchar(2000)
  57.         declare @UpdateSQL nvarchar(2000)
  58.         Declare @WhereCount int
  59.         Select @WhereCount=0 
  60.         
  61.         Select @UpdateSQL='Update '+@tableName+'_Log Set LogDefaultFlag=0 '
  62.         select @InsertSQL='INSERT INTO '+   @tableName +'_Log SELECT *,getdate(),1,'''+@PTID+''' FROM '  + @tableName;
  63.         --------------判斷是否存在DefaultFlag列-------------------------
  64.         if   col_length( @tableName+' ',   'DefaultFlag ')   is not   null 
  65.         BEGIN
  66.             select @InsertSQL=@InsertSQL+' Where DefaultFlag=1 '
  67.             Select @WhereCount=@WhereCount+1        
  68.         END
  69.         --------------判斷是否存在ObjectID列(門店ID)-----------------------------
  70.         if @ObjectID IS NOT NULL AND col_length( @tableName+' ',   'ObjectID ')   is not   null 
  71.         BEGIN
  72.             IF(@WhereCount>0)
  73.             BEGIN
  74.                 select @InsertSQL=@InsertSQL+' AND ObjectID='''+@ObjectID+''' '
  75.                 Select @UpdateSQL=@UpdateSQL+' AND ObjectID='''+@ObjectID+''' '
  76.             END
  77.             ELSE
  78.             BEGIN
  79.                 select @InsertSQL=@InsertSQL+' WHERE ObjectID='''+@ObjectID+''' '
  80.                 Select @UpdateSQL=@UpdateSQL+' WHERE ObjectID='''+@ObjectID+''' '
  81.             END
  82.             Select @WhereCount=@WhereCount+1        
  83.         END
  84.         --------------判斷是否存在ShopID列(門店ID)-----------------------------
  85.         if @ObjectID IS NOT NULL AND col_length( @tableName+' ',   'ShopID ')   is not   null 
  86.         BEGIN
  87.             IF(@WhereCount>0)
  88.             BEGIN
  89.                 select @InsertSQL=@InsertSQL+' AND ShopID='''+@ObjectID+''' '
  90.                 Select @UpdateSQL=@UpdateSQL+' AND ShopID='''+@ObjectID+''' '
  91.             END
  92.             ELSE
  93.             BEGIN
  94.                 select @InsertSQL=@InsertSQL+' WHERE ShopID='''+@ObjectID+''' '
  95.                 Select @UpdateSQL=@UpdateSQL+' WHERE ShopID='''+@ObjectID+''' '
  96.             END
  97.             Select @WhereCount=@WhereCount+1        
  98.         END
  99.         --------------判斷是否存在PTID列(模版ID)-----------------------------
  100.         if @PTID IS NOT NULL AND col_length( @tableName+' ',   'PTID ')   is not   null 
  101.         BEGIN
  102.             IF(@WhereCount>0)
  103.             BEGIN
  104.                 select @InsertSQL=@InsertSQL+' AND PTID='''+@PTID+''' '
  105.             END
  106.             ELSE
  107.             BEGIN
  108.                 select @InsertSQL=@InsertSQL+' WHERE PTID='''+@PTID+''' '
  109.             END
  110.             Select @WhereCount=@WhereCount+1        
  111.         END
  112.         --------------判斷是否存在PhasesID列(階段ID)-----------------------------
  113.         if @PhasesID IS NOT NULL AND  col_length( @tableName+' ',   'PhasesID ')   is not   null 
  114.         BEGIN
  115.             IF(@WhereCount>0)
  116.             BEGIN
  117.                 select @InsertSQL=@InsertSQL+' AND PhasesID='''+@PhasesID+''' '
  118.             END
  119.             ELSE
  120.             BEGIN
  121.                 select @InsertSQL=@InsertSQL+' WHERE PhasesID='''+@PhasesID+''' '
  122.             END
  123.             Select @WhereCount=@WhereCount+1        
  124.         END
  125.         print @UpdateSQL
  126.         exec (@UpdateSQL)
  127.         print @InsertSQL
  128.         Exec  (@InsertSQL)
  129.     END
  130.    
  131. END

#p#

存儲過程有了,再配個XML,根據(jù)參數(shù)把TableName配進去,再加點可配的自定義屬性什么的,例如:

 
 
 
  1.   
  2.     D80E55971198454F97F7EBFE89D239DC
  3.   
  4.   
  5.   T_ChainsReleaseForm
  6.   T_GeneralFromTable
  7.   
  8.     E515165457C5493DA605D4E66416A685
  9.     F9D6E25D978D4E5DB061AE33D68EE279
  10.     D9B9D05380EF4F11B2D2A74D0684DF4B
  11.     45C2B486EB7A463E94B3D55D48DB4A74
  12.     509B5BB3A3B14912ACD633F28A6C91A1
  13.     0CFE53A2A3BB4D6A891B34AA43B0FAC7
  14.     70247883D6414746848E0CE22F06A3F3
  15.     C1E2AD7DFC674DC2AA8434763D4DA0A3
  16.     EE895BBB5B2D43179B196F753ACADCC9
  17.   
  18.   
  19.   T_Shop
  20.   T_Shopkeeper
  21.   T_Acreage
  22.   T_BusinessDistrict
  23.   T_Compete
  24.   T_SupportingFacility

這樣,就一勞永逸了。


文章名稱:如何能更簡潔的記錄表歷史
文章來源:http://www.dlmjj.cn/article/dhseidc.html