很少由数据库设计器为自己和自己构建数据库。 它通常是根据客户的要求构建的。 很多时候,数据库将有多个用户,这些不同的用户可能(也可能不会)在数据库中执行不同的功能。
MS Access使用可以加密数据库(前端和/或后端)以限制谁可以打开数据库的密码来提供一些安全性。 但是,我们仍然面临这样的问题,即用户一旦访问数据库就可以访问,因为密码加密可以解锁整个数据库,而不仅仅是某些部分。
管理多个用户的选项之一是拥有一个可在数据库内执行的总机或活动菜单,并且用户将仅根据其在工作中心中的职责来选择适用于他们的那些项目。 但是,使用此选项的主要挑战是您向用户“探索”他们不应该浏览的数据库位置敞开大门。 在大多数情况下,这并不是真正的问题,因为普通员工不想破坏他们的工作地点。 但是,当涉及到个人,机密甚至医疗信息时,它应该让数据库管理员在其数据库中内置某些保护措施,以确保不受限制的信息不会偶然或偶然地出现。
另一种解决方案是为每种类型的用户创建单独的前端。 当一个用户需要访问一组特定的表单和报表时,可以将这些对象加载到链接到后端的一个前端中。 另一个用户需要一组不同的表单和报告,因此数据库管理员将构建另一个合适的前端。 然而,这种解决方案的明显挑战是不断扩展不同的有限元。 由于某些不同的用户(或不同的用户
类型的用户)可能需要使用相同的对象。 然后,每次更改这些对象之一时,还必须更新包含该对象的所有FE。我发现自己在工作中心处于这种情况。 我们只有10名定期使用数据库的员工,有时还有10多名在短期内访问非常有限的员工。 但是,这20名员工在数据库中的角色完全不同。 此外,由于我们接触的几乎所有内容都是《隐私法信息》(我在联邦政府工作),因此我们希望尽可能地控制访问权限。
随着时间的推移,我根据用户开发了一种限制对数据库访问的方法。 这样做的方法很简单:
- 创建一个用户表
- 建立公共常量和变量
- 确定谁访问了数据库
- 确定如何处理该用户
- 允许特定于用户的数据库访问
您的表可能具有不同的字段,但是我的表(tblUsers)根据我的要求具有某些字段。 随意列出自己的需求列表并适当构建表。 我的表的说明如下:
Field Name Data Type
UserKey Long (AutoNumber)
UserID Text
UserName Text
UserRights Integer
UserMachine Text
UserDirectory Text
UserSigBlock Memo
UserID是从OS环境返回的值,用于标识当前登录到计算机的人员。 我们所有的计算机都需要智能卡访问权限,因此安全性始终是双重身份验证。 只有经过验证的用户才能访问数据库。
下面将解释UserRights,但这是一个值,它指示用户将具有什么访问级别(或访问区域)。 这在最后的步骤中起作用。
由于我们的IT部门经常要求提供用户计算机名称的列表,因此我已将其包括在列表中,并且也可以从OS环境中轻松获得。
有时,我们的用户会从数据库中下载报告或电子表格,拥有用户建立的目录有助于确保他们的项目始终在一个地方。
我们的办公室经常从数据库发送电子邮件,因此我还包括了一个用户可自定义的电子邮件签名块。 这使数据库可以快速将签名块添加到外发电子邮件中。 这很方便。
现在,您的用户表已创建,我们需要弄清楚如何使用它!
我创建了一个模块,其中包含我的公共变量和公共函数列表,称为modSystem。 以下是我用来限制用户访问权限的列表:
Option Compare Database
Option Explicit
'User Rights Constants
Public Const UserAdmin As Integer = 1
Public Const UserOIC As Integer = 2
Public Const UserPromo As Integer = 3
Public Const UserRecords As Integer = 4
Public Const UserSrRecorder As Integer = 5
Public Const UserRecorder As Integer = 6
'User Variables
Public glngCurrentUser As Long
Public gstrUserID As String
Public gstrCurrentUser As String
Public gintUserRights As Integer
Public gstrUserDirectory As String
Public gstrUserMachine As String
我已经为各种类型的用户建立了常量,因为记住用户类型比记住用户权限的值容易。 此外,如果我在整个数据库中使用这些全局常量,并且需要对这些常量的实际值进行任何更改,则无需查找每个“用户权限”实例。 全球常数将解决这一问题。
为了解释我的公共变量,我希望允许数据库始终掌握某些数据。 例如,gstrUserID是从操作系统返回的系统用户ID。 变量gstrCurrentUser是用户的实际名称(例如“ Egbert Schmuckatelli”)。 当数据库管理员设置用户帐户时,将建立此值。 变量glngCurrentUser是tblUsers的主键。 其他变量是不言自明的。
每当我们想将某个用户标识为完成某项任务或必须提供特定于用户的信息时,我都会在整个数据库中使用这些变量。
这是最简单的步骤。 当数据库打开时,我使用启动表来自动确定谁登录了数据库以及数据库将对该用户执行的操作。 在表单的OnOpen事件中,我具有以下内容:
Private Sub Form_Open(Cancel As Integer)
On Error GoTo EH
Dim db As Database
Dim rst As Recordset
Dim strSQL As String
gstrUserID = Environ("USERNAME")
Set db = CurrentDb()
strSQL = "SELECT * FROM tblUsers " & _
"WHERE UserID = '" & gstrUserID & "';"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
If Not rst.EOF Then
With rst
.MoveFirst
glngCurrentUser = !UserKey
gstrCurrentUser = !UserName
gintUserRights = !UserRights
gstrUserMachine = !UserMachine
gstrUserDirectory = !UserDirectory
End With
Else
'This User does not exist in the Users Table
'Determine what to do--whether to Quit or set up new account
End If