 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 1 樓
|
發表於: 星期五 三月 05, 2004 10:08 pm 文章主題: VFP表跟蹤實現方法(轉貼) |
|
|
來源:編成愛好者
摘要 本文介紹了Visual Foxpro中數據庫觸發技術的應用實例,為VFP表建立跟蹤日誌,提供解決網絡多用戶環境中數據文件安全的一種方法。
關鍵詞 觸發技術,表跟蹤,自定義函數
表跟蹤問題的提出:
在管理信息系統的正常運行中,信息的安全性問題日益突出。雖然網絡為我們提供了一定的數據安全性,只有授權的用戶才能對數據進行日常的維護,但有時用戶的誤操作可能導致數據的丟失或混亂;另外,有時我們需要對數據的改動留下記載等。對重要的數據文件,記錄每一個數據變化的審核日誌,對其建立其相應的日誌表來跟蹤對它的增、刪和修改操作是十分必要的。日誌表中記載了何時、何用戶進行了何種操作,記載了被用戶增加或刪除的記錄信息,以及被修改記錄的原來信息和修改後的信息,將被操縱過的記錄進行備份。
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',
USE IN tmp
oldselect=SELECT() &&生成日誌表結構
SELE 0
CREATE (m.logname) FROM tmp
DELETE FILE tmp.dbf
SELECT (oldselect)
RETURN _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|