下面是本人通過Access的鏈接表對於局域網絡數據庫的共享的實例探討,從一個側面介紹了Access的局域網絡數據庫的安全共享方法,經實踐,方法簡單易行,特別是在局域網內能起到很好的安全防范作用。
問題的提出
我在使用Access初期開發應用程序時,網絡共享數據庫采用了映射網絡驅動器的方法:即先映射網絡驅動器(固定盤符),再把數據庫進行拆分,後台數據庫放在網絡驅動器,然後打開前台數據庫,點“文件”→“獲取外部數據”→“鏈接表”,從映射網絡驅動器上把所需的後台數據庫中(網絡數據庫)鏈接起來。這種方法雖然十分簡便,但問題也是顯而易見的:存在著諸如拷貝數據庫,打開數據庫進行直接的修改刪除等安全操作隱患,如果在網絡數據庫上加密碼,那麼每個用戶在進行應用程序操作時一開始就要進行密碼輸入,且不說煩瑣(特別是鏈接多個數據庫),因為每個操作員都知道密碼,也起不到保密的作用。那麼如何做到使用鏈接表共享網絡數據庫的安全,
數據庫說明及運行環境
本人開發的OBS系統是一套手袋行業的管理系統,主數據庫名為BAG.mdb,隨著開發的深入及應用,數據量加大,隨後進行了拆分,前台仍為BAG.mdb(約20M,內含所有本系統所開發的查詢、窗體、報表、宏、模塊),後台拆分為3個數據庫:BAG_be.mdb(約200M),bag_1yb.mdb(約120M),倉庫帳.mdb(約10M),加之之前FOXPRO2.6 FOR DOS的MRP-I應用系統的轉出的3個後台數據庫:大庫.mdb(約460M),小庫.mdb(約400M),臨時庫.mdb(約200M)。共有6個後台數據庫
後台數據庫存放在一台安裝有W2K的建有控制域的服務器上,域名為HYOBS,在其一NTFS分區上設為共享(用戶的建立及權限的分配在此略),共享文件名為HY2007,此盤共建有4個目錄, 6個數據庫的網絡位置設計如下:
BAG_be.mdb、bag_1yb.mdb、倉庫帳.mdb3個數據庫放於\\HYOBS\HY2007\OBS-SC\下,大庫.mdb放於\\HYOBS\HY2007\大庫\下,小庫.mdb放於\\HYOBS\HY2007\小庫\下,臨時庫.mdb----\\HYOBS\HY2007\小庫\下,為演示說明用方便,密碼統一設成a00001)
具體步驟
一、 鏈接表(鏈接滿足需要的表)
1、把上述的6個後台數據庫,拷貝到本地的任一分區任一目錄中,打開前台數據庫BAG..mdb,點“文件”→“獲取外部數據”→“鏈接表”,把所需的網絡數據庫文件全部鏈接進來。
2、在主數據庫BAG.mdb中建立一個表(表名為:表_數據庫),表結構如圖1:
用以下代碼獲取所有鏈接表及其所在的數據名稱(以下程序可加在你認為合造的地方,按鈕也可以)
Dim aa As String ‘表所對應的數據庫名稱
Dim stemp1 As String
Dim stemp2 As String
Dim stemp3 As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
'先清除空表
stemp1 = "delete * from 表_數據庫"
rs.Open stemp1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
'獲取所有鏈接表及其所在的數據名稱
Dim i As Integer, tdf As TableDef, qdf As QueryDef
For i = 0 To CurrentDb.TableDefs.Count - 1
'以下暫定數據庫文件名不會超過255個字任符(注1個漢字和1個字母均占1個字符,包括.mdb 4個字符)
For k = 6 To 255
If Left(Right(CurrentDb.TableDefs(i).Connect, k), 1) = "\" Then
aa = Right(CurrentDb.TableDefs(i).Connect, k - 1)
k = 255
Else
aa = ""
End If
Next k
stemp2 = "insert into 表_數據庫(表名稱,對應數據庫名稱) select '" & CurrentDb.TableDefs(i).Name & "','" & aa & "' "
rs.Open stemp2, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Next i
'由於新增的記錄中有6個系統表的表名MSysAccessObjects,MSysAccessXML,MSysACEs,MSysObjects,MSysQuerIEs,MSysRelationships,及剛建立的表名(表_數據庫),請刪除:
stemp3 = "delete * from 表_數據庫 where [對應數據庫名稱]='" & "" & "'"
rs.Open stemp3, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
完成後如下圖2:
二、 刷新鏈接表(把鏈接表定位到網絡上)
‘刷新各個數據表,使之鏈接到Windows2000上的共享數據庫上
Dim db As Database
Dim a1 As TableDef
Set db = CurrentDb
Set p = CurrentDb.OpenRecordset("select * from 表_數據庫")
‘調用表(表_數據庫)中新增的記錄(表名稱及對應數據庫名稱)
Do Until p.EOF
If p("對應數據庫名稱") = "倉庫帳.mdb" Then
Set a1 = db.TableDefs(p("表名稱"))
a1.Connect = "ms Access;PWD=a0001;DATABASE=\\HYOBS\ HY2007\OBS-SC\倉庫帳.mdb"
a1.RefreshLink
End If
If p("對應數據庫名稱") = "BAG_be.mdb" Then
Set a1 = db.TableDefs(p("表名稱"))
a1.Connect = "ms Access;PWD=a0001;DATABASE=\\HYOBS\ HY2007\OBS-SC\ BAG_be.mdb"
a1.RefreshLink
End If
If p("對應數據庫名稱") = "bag_1yb.mdb" Then
Set a1 = db.TableDefs(p("表名稱"))
a1.Connect = "ms Access;PWD=a0001;DATABASE=\\HYOBS\ HY2007\OBS-SC\ \bag_1yb.mdb"
a1.RefreshLink
End If
If p("對應數據庫名稱") = "大庫.mdb" Then
Set a1 = db.TableDefs(p("表名稱"))
a1.Connect = "ms Access;PWD=a0001;DATABASE=\\HYOBS\ HY2007\大庫.mdb"
a1.RefreshLink
End If
If p("對應數據庫名稱") = "小庫.mdb" Then
Set a1 = db.TableDefs(p("表名稱"))
a1.Connect = "ms Access;PWD=a0001;DATABASE=\\HYOBS\ HY2007\小庫.mdb"
a1.RefreshLink
End If
If p("對應數據庫名稱") = "臨時庫.mdb" Then
Set a1 = db.TableDefs(p("表名稱"))
a1.Connect = "ms Access;PWD=a0001;DATABASE=\\HYOBS\ HY2007\臨時庫.mdb"
a1.RefreshLink
End If
p.MoveNext
Loop
Set a1 = Nothing
其他說明
1:上述的\\HYOBS 也可用服務器的IP地址代替
2:上述代碼可放在你認為合適的地方,按上述方法運行一次即可,完成後,編譯前台數據庫BAG.mdb(內含所有本系統所開發的查詢、窗體、報表、宏、模塊),分發給客戶端,一次性完成,客戶端無須再運行。
3:運行時為何會出現以下畫面圖3
正常情況下是不會出現的,這是不小心誤刪鏈接造成的:原因是你在打開前台數據庫BAG..mdb,點“文件”→“獲取外部數據”→“鏈接表”,把所需的網絡數據庫文件全部鏈接進來後。 “表_數據庫”采集的就是全部鏈接表的信息(表名稱、對應數據庫名稱),如果此時不小心刪除了鏈接表,在程序代碼Set a1 = db.TableDefs(p("表名稱"))中,就找不到p("表名稱")對應的鏈接表了(被你刪除了),所以出現上述報錯。