历史开奖记录表,SQL-记录表历史

很多时候,都需要对数据表进行历史记录。比如每修改一次表单,之前的表单数据都需要计入历史。当表单比较多的时候,记录历史是一件比较麻烦的事情。又要建日志表,又要写存储过程,又要写页面逻辑等等。有没有通用点的办法呢?最近做项目时碰到了,要求每次审核、退回等操作时就要记录表历史。于是,笔者就想到了以下方案。在此与大家分享了,如果有更合适的或合理的建议,请回复本帖。
1)创建日志表
一个一个建表是一件烦躁的事,而且还容易出错。那么,以下存储过程就能批量建表了,还添加了LogCreateDate、LogDefaultFlag、LogPTID这3个字段。值得注意的是,创建表结构可以用以下语句“SELECT * Into tableName_Log FROM tableName”。如果只需要复制表结构,那就插入一行,再删除就是。
SQL里面实现遍历数据集不方便,不想用游标,于是采用了以下方式。具体存储过程如下:
USE [NbShop] GO /****** Object: StoredProcedure [dbo].[CreateLogTable] Script Date: 07/02/2011 12:54:32 ******/ SET ANSI_NULLS _disibledevent=>
2)删除日志表
在开发过程中,难免会对字段进行更改。于是删除的存储过程也得有。具体代码如下:
USE [NbShop] GO /****** Object: StoredProcedure [dbo].[DropLogTable] Script Date: 07/02/2011 12:54:29 ******/ SET ANSI_NULLS _disibledevent=> 以上语句值得注意的是在查找以“_Log”结尾的表名的搜索条件,需要加上“escape '\'”。
3)记录日志
日志表有了,还得记录日志呢。为每个表写个存储过程会过于繁琐,而且改动了就得跟着改动。就是码农也吃不消。于是有了以下存储过程,该存储过程定义了7个参数,允许传入存储过程、
表名、Where条件等。具体如下:
USE [NbShop] GO /****** Object: StoredProcedure [dbo].[RecordLog] Script Date: 07/02/2011 12:54:07 ******/ SET ANSI_NULLS _disibledevent=>0) BEGIN select @InsertSQL=@InsertSQL+' AND ObjectID='''+@ObjectID+''' ' Select @UpdateSQL=@UpdateSQL+' AND ObjectID='''+@ObjectID+''' ' END ELSE BEGIN select @InsertSQL=@InsertSQL+' WHERE ObjectID='''+@ObjectID+''' ' Select @UpdateSQL=@UpdateSQL+' WHERE ObjectID='''+@ObjectID+''' ' END Select @WhereCount=@WhereCount+1 END --------------判断是否存在ShopID列(门店ID)----------------------------- if @ObjectID IS NOT NULL AND col_length( @tableName+' ', 'ShopID ') is not null BEGIN IF(@WhereCount>0) BEGIN select @InsertSQL=@InsertSQL+' AND ShopID='''+@ObjectID+''' ' Select @UpdateSQL=@UpdateSQL+' AND ShopID='''+@ObjectID+''' ' END ELSE BEGIN select @InsertSQL=@InsertSQL+' WHERE ShopID='''+@ObjectID+''' ' Select @UpdateSQL=@UpdateSQL+' WHERE ShopID='''+@ObjectID+''' ' END Select @WhereCount=@WhereCount+1 END --------------判断是否存在PTID列(模版ID)----------------------------- if @PTID IS NOT NULL AND col_length( @tableName+' ', 'PTID ') is not null BEGIN IF(@WhereCount>0) BEGIN select @InsertSQL=@InsertSQL+' AND PTID='''+@PTID+''' ' END ELSE BEGIN select @InsertSQL=@InsertSQL+' WHERE PTID='''+@PTID+''' ' END Select @WhereCount=@WhereCount+1 END --------------判断是否存在PhasesID列(阶段ID)----------------------------- if @PhasesID IS NOT NULL AND col_length( @tableName+' ', 'PhasesID ') is not null BEGIN IF(@WhereCount>0) BEGIN select @InsertSQL=@InsertSQL+' AND PhasesID='''+@PhasesID+''' ' END ELSE BEGIN select @InsertSQL=@InsertSQL+' WHERE PhasesID='''+@PhasesID+''' ' END Select @WhereCount=@WhereCount+1 END print @UpdateSQL exec (@UpdateSQL) print @InsertSQL Exec (@InsertSQL) END END 存储过程有了,再配个XML,根据参数把TableName配进去,再加点可配的自定义属性什么的,例如:
D80E55971198454F97F7EBFE89D239DC T_ChainsReleaseForm T_GeneralFromTable E515165457C5493DA605D4E66416A685 F9D6E25D978D4E5DB061AE33D68EE279 D9B9D05380EF4F11B2D2A74D0684DF4B 45C2B486EB7A463E94B3D55D48DB4A74 509B5BB3A3B14912ACD633F28A6C91A1 0CFE53A2A3BB4D6A891B34AA43B0FAC7 70247883D6414746848E0CE22F06A3F3 C1E2AD7DFC674DC2AA8434763D4DA0A3 EE895BBB5B2D43179B196F753ACADCC9 T_Shop T_Shopkeeper T_Acreage T_BusinessDistrict T_Compete T_SupportingFacility
这样,就一劳永逸了。
Tags:  培训记录表 值班记录表 家访记录表 会议记录表 历史开奖记录表

延伸阅读

最新评论

发表评论