有没有一种简单的方法允许用户只编辑他们创建的表单条目,只允许管理员编辑表格/所有表单?例如:我需要我的全体员工能够添加和编辑他们自己的会议,而不能编辑其他员工的会议。
1 回答
这并不简单... Access 曾经内置了各种安全性(现在仍然如此),但现在已被弃用,因此如果您的用户想要并且知道如何绕过您的表单。Access 确实不是一个安全的平台,因此您尝试构建的任何安全性都只能防止无意的错误,甚至不能防止半心半意的攻击。
无论如何,您需要捕获每个用户的用户 ID(Access 无法直接执行此操作;此功能会执行此操作):
Private Declare PtrSafe Function WNetGetUser Lib "mpr.dll" Alias "WNetGetUserA" (lpName As Any, ByVal lpUserName As String, lpnLength As Long) As Long
Public Function WSUserName() As String 'Returns the workstation user name
Dim Ret As Long, cbusername As Long, UserName As String
UserName = Space(256)
cbusername = Len(UserName)
Ret = WNetGetUser(ByVal 0&, UserName, cbusername)
If Ret = 0 Then
UserName = Left(UserName, InStr(UserName, Chr(0)) - 1)
Else
UserName = ""
End If
WSUserName = UserName
End Function
然后,您需要将其用作Creating_User
表格/表单中文本字段的默认值。
您需要有一个tbl_Users
表,其中至少有一个UserID
包含WSUserName()
用户的字段和一个IsAdministrator
是/否字段。
然后,在您的表单中,在Form_Current
事件处理程序中,您需要:
Me.AllowEdits = DLookup("IsAdministrator", "tbl_Users", "UserID = " & WSUserName()) Or Me.Creating_User = WSUserName()
Me.AllowDeletions = DLookup("IsAdministrator", "tbl_Users", "UserID = " & WSUserName()) Or Me.Creating_User = WSUserName()
这将防止用户编辑/删除其他人的记录,同时允许管理员编辑/删除任何人的记录。任何人都可以添加记录,并且由于该Creating_User
字段默认为WSUserName()
只读并且应该是只读的,因此只有他们(或管理员)才能对它们执行任何操作。
此方法的唯一问题是它假定您的 PC 没有共享登录。如果 PC 在早上登录并且任何人都可以走过去开始使用它,那么您将不得不使用不同的方法,但是这种方法对于用户使用自己的 ID 登录的 PC 来说可以正常工作,执行他们的工作,然后注销,然后其他人可以登录。