程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Access數據庫 >> 關於Access數據庫 >> ACCESS使用鏈接表共享數據庫的安全性案例探討

ACCESS使用鏈接表共享數據庫的安全性案例探討

編輯:關於Access數據庫
 Access同SQL Server等其他數據庫相比安全性相對較低,但如果根據不同的情況,靈活運用本身提供的安全機制,綜合其他安全措施的應用,也能取得相當滿意的效果。

     下面是本人通過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("表名稱")對應的鏈接表了(被你刪除了),所以出現上述報錯。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved