VFP表跟踪实现方法
在管理信息系统的正常运行中,信息安全问题日益突出。虽然网络为我们提供了一定的数据安全性,只有授权用户才能对数据进行日常维护,但有时用户的误操作可能会导致数据丢失或混乱;此外,有时我们需要保留数据更改的记录。对于重要的数据文件,需要记录每一次数据变更的审计日志,并建立其对应的日志表,以跟踪其添加、删除和修改。日志记录了什么时候,哪个用户做了什么样的操作,记录了用户添加或删除的信息,以及修改记录的原始信息和修改信息,并备份了被操作的记录。
VFP触发器技术:
Visual FoxPro与以前版本的一个主要区别在于它使用了数据库的强大功能,使其成为一个真正的数据库。VFP的数据库容器包括表及其各种属性定义,还包括后端SQL中的触发器技术。
触发器的使用为数据库中的表提供了一个记录级的规则(即检测器)。触发器分为三个操作:插入触发器、更新触发器和删除触发器。插入触发器用于向表中添加记录时触发的检测程序,更新触发器用于修改记录并保存回表中时触发的检测程序,删除触发器用于删除表中记录时触发的检测程序。VFP允许您为任何操作设置不同的规则,这些操作可以是表达式或用户定义的函数(UFD)。如果响应为真,说明触发成功;如果响应为假,则意味着触发器失败。用户定义的函数(ufd)存储在数据库容器中。
创建触发器有两种方式:
1)打开表属性对话框,在插入、更新或删除触发器框中输入触发器表达式或用户定义函数(UFD);
2)使用创建触发器命令。
创建、修改或删除存储过程有三种方式:
1)在项目管理器中,选择并展开一个数据库,选择“存储过程”,然后选择“新建”、“修改”或“删除”按钮;
2)在数据库设计器中,从“数据库”菜单中选择“编辑存储过程”按钮;
3)在命令命令窗口中,使用修改过程命令。
表跟踪设计:
利用Insert触发器、Update触发器、Delete触发器三种操作原理,我们可以构造一个备份被操纵记录的自定义函数,将其添加到需要表跟踪的数据文件触发器中,实现表跟踪。这样,无论用户是使用程序操纵该表,还是直接打开该表来添加、删除和修改记录,都可以激发触发器来记录被操纵的记录。
我构造了四个通用的用户自定义函数,Inslog()、Dellog()、Modlog()和addlog(),存储在数据库容器的存储过程中。添加Inslog()函数、Dellog()函数、Modlog()函数对需要表跟踪的数据文件插入触发器、删除触发器、更新触发器,这样数据文件中记录的增加、删除、修改都会刺激触发器进行日志记录。Addlog()用于建立被跟踪表的日志表结构。日志表结构设计包含了被跟踪表的所有字段信息,增加了用户标志opid、操作日期和时间optime、操作标志opmak字段。日志的命名规则是在被跟踪表的表名前加‘L’以示区别。另外,我在存储数据文件的目录下设置了一个子目录LOGDBFS,专门用来存储日志表进行管理。四个功能编程如下:
*Insert触发器:
FUNCTION in slog()
m . path = SUBSTR(DBF(),1,rat('\ ',DBF())
m . logname = m . path+' LOGDBFS \ L '+SUBSTR(DBF(),Len(m . path)+1)
if not file(m . logname)
= addlog()& &建立日志表结构
迪恩
scattermemvar
m
FROM MEMVAR &&记录添加的记录
return.t .
*删除触发器:
FUNCTION dellog()
m . path = SUBSTR(DBF(),1,rat('\ ',DBF())
m . logname = m . path+' LOGDBFS \ L '+SUBSTR(DBF(),Len(m . path)+1)
if not file(m . logname)
= addlog()
迪恩
scattermemvar
m . opmak = ' Delete '
*更新触发器:
FUNCTION modlog()
m . path = SUBSTR(DBF(),1,rat('\ ',DBF())
m . logname = m . path+' log dbfs \ L '+SUBSTR(DBF(),LEN(m . path)+1)
IF NOT FILE(m . logname)
= addlog()
ENDI
DIME alog[FCOUNT()+3]
*建立日志表结构:
函数addlog()
*取被跟踪的表字段
copystru到tmp extend
*建立用户标志、操作时间和操作标志字段信息
插入tmp.dbf
(字段名称,字段类型,字段长度);
值(' OPMAK ',' C ',6)
插入tmp.dbf
(字段名称,字段类型,字段长度);
值(' OPID ',' C ',10)
插入tmp.dbf
(字段名称,字段类型,字段长度);
值(' optime ',' t ',8)
在tmp中使用
old select = select()& & generate log table structure
sele 0
create(m . logname)from tmp[/]
0条评论