您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> VFP >> 辅导 >> 正文    
  VFP数据库触发技术的应用实例 【注册男护士专用博客】          

VFP数据库触发技术的应用实例

www.nanhushi.com     佚名   不详 

  表跟踪问题的提出:  

  在管理信息系统的正常运行中,信息的安全性问题日益突出。虽然网络为我们提供了一定的数据安全性,只有授权的用户才能对数据进行日常的维护,但有时用户的误操作可能导致数据的丢失或混乱;另外,有时我们需要对数据的改动留下记载等。对重要的数据文件,记录每一个数据变化的审核日志,对其建立其相应的日志表来跟踪对它的增、删和修改操作是十分必要的。日志表中记载了何时、何用户进行了何种操作,记载了被用户增加或删除的记录信息,以及被修改记录的原来信息和修改后的信息,将被操纵过的记录进行备份。  

  VFP触发技术:  

  Visual Foxpro与它的前期版本重大差别之一是使用了数据库(Database)这一强大功能,使之成为一个真正的DataBase。VFP的Database Container包含了表(Table)及表的各种属性定义,也包含了属于后端的SQL中的触发技术(Trigger)。  

  Trigger的使用为Database中的Table提供了一个记录级规则(即检测程序)。Trigger分为Insert Trigger、Update Trigger和Delete Trigger三种操作。Insert Trigger用于Table新增记录时所触发的检测程序,Update Trigger用于Table修改记录回存时所触发的检测程序,Delete Trigger用于Table中记录被删时所触发的检测程序。VFP允许对任一种操作设定不同的规则,该规则可以是表达式或用户自定义函数(UFD),若响应为真值时,表示触发成功,若响应为假值时,表示触发失败。用户自定义函数(UFD)存储在Database Container中。  

  创建触发器有两种方式:  

  1) 打开表属性”对话框,在 INSERT、UPDATE 或 DELETE 触发器框中,输入触发器表达式或用户自定义函数(UFD);  

  2) 使用 CREATE TRIGGER 命令。  

  创建、修改或移去存储过程有三种方式:  

  1) 在项目管理器中,选择并展开一个数据库,选定“存储过程”,然后选择“新建”、“修改”或“移去”按钮;  

  2) 在数据库设计器中,从“数据库”菜单中选择“编辑存储过程”按钮;  

  3) 在COMMAND命令窗口中,使用 MODIFY PROCEDURE 命令。  

  表跟踪设计:  

  利用Insert Trigger、Update Trigger和Delete Trigger三种操作原理,我们可以构造备份被操纵记录的用户自定义函数,并将其加入需要进行表跟踪的数据文件Trigger中,以实现表跟踪。这样,不论用户使用程序进行对此表的操纵或直接打开此表进行增删和修改记录,都能激发Trigger将被操纵记录进行日志记载。  

  本人构造了四个通用的自定义函数,Inslog()、Dellog()、Modlog()和addlog(),存放于Database Container的存储过程中。在需要进行表跟踪的数据文件的Insert Trigger、Delete Trigger和Update Trigger中分别加入Inslog()函数、Dellog()函数和Modlog()函数,以使对数据文件中记录的增、删和修改均激发Trigger进行日志记载。addlog()用于建立被跟踪表的日志表结构,日志表的结构设计包含了被跟踪表的所有字段信息,并且增加了用户标志opid、操作日期时间optime和操作标志opmak字段。日志表的命名规则为被跟踪表的表名前加‘L’,以示区分,另外本人在存放数据文件目录下另设子目录LOGDBFS,专用于存放日志表以便管理。这四个函数程序设计如下: 

*Insert Trigger:  
FUNCTION inslog()  
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() &&建立日志表结构  
ENDI  
SCATTER MEMVAR  
m.opmak=’增’ &&增加记录标志  
m.opid=SYS(0) &&取网络用户标志  
m.optime=datetime() &&增加记录时间  
INSERT INTO (m.logname) ;  
FROM MEMVAR &&记载所增记录  
RETURN .T.  

*Delete Trigger:  
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()  
ENDI  
SCATTER MEMVAR  
m.opmak=’删’ &&删除记录标志  
m.opid=SYS(0)  
m.optime=datetime()  
INSERT INTO (m.logname) ;  
FROM MEMVAR &&记载所删记录  
RETURN .T.  

*Update Trigger:  
FUNCTION modlog()  
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()  
ENDI  
DIME alog[FCOUNT()+3]  
alog[FCOUNT()+2]=SYS(0)  
alog[FCOUNT()+3]=datetime()  
alog[FCOUNT()+1]=’修(原)’  
FOR i=1 TO FCOUNT()  
alog[I]=oldval(field[I])  
ENDFOR  
INSERT INTO (m.logname) ;  
FROM ARRAY alog &&记载更改前信息  
alog[FCOUNT()+1]=’修(现)’  
FOR i=1 TO FCOUNT()  
alog[I]=EVALUATE(field[I])  
ENDFOR  
INSERT INTO (m.logname) ;  
FROM ARRAY alog &&记载更改后信息  
RETURN .T.  

*建立日志表结构:  
FUNCTION addlog()  
*取被跟踪表字段  
COPY STRU TO tmp EXTEND  
*建立用户标志、操作时间和操作标志字段信息  
INSERT INTO tmp.dbf ;  
(field_name,field_type,field_len);  
VALUES (’OPMAK’,’C’,6)  

INSERT INTO tmp.dbf ;  
(field_name,field_type,field_len);  
VALUES (’OPID’,’C’,10)  
INSERT INTO tmp.dbf ;  
(field_name,field_type,field_len);  
VALUES (’OPTIME’,’T’,8)  
USE IN tmp  
oldselect=SELECT() &&生成日志表结构  
SELE 0  
CREATE (m.logname) FROM tmp  
DELETE FILE tmp.dbf  
SELECT (oldselect)  
RETURN

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。