刚刚学习Access不久,在建立表的过程中发现一个问题:
如果允许用户通过窗体直接从数据表中删除数据,可能不安全。会出现一种情况——即,用户删除了他权限上允许他删,而事实上却很重要的数据(出于误删,或是根本就是恶意删除)。这时候就需要找回数据,应该做恢复数据及回滚覆盖操作。这就有个如何安全恢复的问题。
假设:恰好数据被删除掉之后没有被立刻发现,很多员工又继续用了相当长一段时间,产生了大量数据;而之前的数据库备份又比较久远,这就比较麻烦,以我现在的水平从Access底层是解决不了的。
受权限表的设计原理启发,我想到可以在数据表中添加辅助字段,形如"WantDelete"(是否删除字段),"WantHide"(是否隐藏显示字段),"IfActive"(是否活动字段),"LastEdit"(上次编辑记录的ID字段),"DeleteTime"(记录编辑时间字段),"EditTime"(记录编辑时间字段)来控制用户端的操作:
我的构想是:
1.新增:用户的新增操作像以前一样可以进行,新加的"WantDelete","WantHide"字段默认为否,"IfActive"默认为真,"LastEdit","DeleteTime"字段为空,"EditTime"字段为新增时间。
2.删除:用户的任何删除操作都不是对表中数据做任何实际操作的,而是对"WantDelete""WantHide""IfActive"打钩,程序对"WantDelete""WantHide"已打钩项目进行隐藏操作;在查询的时候对"IfActive"进行判断,对不活动的记录不进行操作;同时将删除操作的时间记入"DeleteTime"字段。
3.编辑:编辑操作转变为
->对原纪录做Copy新增
->在Copy记录中的"LastEdit"中写入原记录的ID
->在Copy记录中"EditTime"记下当前时间
->将Copy记录的"WantDelete","WantHide"字段设置为否,"IfActive"设置为真,"DeleteTime"字段设为空
->在原记录中,设置仅将"WantHide"值为真,"IfActive"设置为否,"DeleteTime"字段记录记下当前时间(不设置"WantDelete"为真是为了方便管理员区分编辑和删除操作)
->刷新显示的时候,实际上是做的数据筛选,将"IfActive"设置为否的记录隐藏掉。
4.查询:设计查询的时候,把"IfActive"为否的记录筛掉不做操作,这样就可以做到类似显示真实删除掉记录后的效果。
可以方便的在管理员界面进行管理,提取数据生成日志报表,并对真的需要删掉的记录由管理员进行最终的备份+删除操作。
关于数据恢复的操作:
恢复数据操作的主体应该是管理员,由管理员对隐藏掉的数据进行回溯查询,找到数据记录正确的数据条,修改其相应的"WantDelete","WantHide","IfActive","LastEdit","DeleteTime","EditTime"字段的值即可。
后记:
后来想了一下,这个设计应该能做的更好:其实应该将记录添加人,删除人,编辑操作人作为单独的字段独立出来,记录下做操作的员工ID对后续的管理会更有帮助。
先把这个实现以后调试一段时间看看效果,感觉这里面应该还可以深入,放在以后讲。