【问题标题】:Is there a way to protect a field so that only certain users can edit?有没有办法保护一个字段,以便只有某些用户可以编辑?
【发布时间】:2017-04-19 19:17:28
【问题描述】:

我有一个 Access 2010 数据库,我需要在其中更新一个字段。现在我的一个表单上有一个按钮,它将复制选定的行。我知道我可以通过在该字段上将Locked 属性设置为Yes 来使该字段不重复。

我需要做的是找到一种方法,使字段不重复,但仍可对某些人进行编辑。我不想设置Locked 属性,因为它会为所有人锁定它。

除了更改Duplicate record 按钮的工作方式外,我不知道该怎么做。现在它只是简单地复制所选行并将其粘贴到New Record 行中。这将获取所有不是Locked 的字段。

我读到过可能使用一堆变量并将它们设置为每个字段的值,但这似乎很麻烦,因为我必须设置 160 多个字段。然后将它们粘贴到New Record 行中。我宁愿不必这样做。

我使用 VBA 只是不太使用 Access。 VBA 解决方案对我来说很好,我没有尝试过任何东西,因为我什至不知道从哪里开始。

【问题讨论】:

  • 因此,当您单击按钮时,它将在表中创建一个新行,其中包含旧记录中的所有字段,但设置为“锁定”的任何字段除外?您将如何决定您真正希望某人能够编辑哪些“锁定”字段?您将如何决定要允许哪些用户?
  • @WayneG.Dunn 只有一个字段我不想复制,并且只有某些用户可以编辑。我还不知道允许编辑的用户列表。我只维护数据库,创建它的人已经离开了公司。

标签: ms-access vba ms-access-2010


【解决方案1】:

我建议使用 sub 来锁定/解锁控​​件,如下所示:

Private Sub SetControlsLocked(ForceLocked As Boolean)

    Dim bLocked As Boolean
    Dim sUser As String

    If ForceLocked Then
        ' Always lock before copying
        bLocked = True
    Else
        ' More secure method than Environ("USERNAME")
        sUser = CreateObject("WScript.Network").UserName
        ' Lock for everyone except some users
        ' If the list is longer or changes regularly, lookup the Username in a table instead
        bLocked = Not (sUser = "jane" Or sUser = "bob" Or sUser = "mike")
    End If

    ' do the locking
    Me!Control1.Locked = bLocked
    Me!Control2.Locked = bLocked

End Sub

(有关“更安全”的声明,请参阅https://stackoverflow.com/a/32565953/3820271 上的 cmets)。

并应用到您的复制按钮例程中...

Private Sub cmdCopy_Click()

    ' Lock before copying!
    Call SetControlsLocked(True)

    ' ... your existing copy routine

    ' Unlock for special users
    Call SetControlsLocked(False)

End Sub

...打开表单时:

Private Sub Form_Load()
    ' Lock for non-special users
    Call SetControlsLocked(False)
End Sub

【讨论】:

  • 做到了!感谢您的帮助!
【解决方案2】:

我所做的是有一个用户表及其权限级别和 Windows 登录用户名。我使用Environ("USERNAME") 捕获用户名并与用户记录匹配并适当地设置表单,通常只是禁用/隐藏特定按钮。

但确实必须做更多的数据库设置,以防止用户访问受限数据。比如隐藏导航窗格、禁用功能区、禁用右键快捷菜单、禁用功能键,甚至可能发布为可执行文件。

但如果他们知道后端在哪里,是什么阻止他们打开它?除非你去 SQLServer 数据库之类的东西,否则真的什么都没有。

【讨论】:

  • 我不担心最终用户会弄乱后端的任何东西。他们甚至都不知道有一个。 Access DB 只是 SQL DB 的前端。我是唯一可以直接访问 SQL 的人。我只需要一种方法来限制用户可以编辑一个字段。
  • 好吧,我建议的是一种方式,它对用户是透明的,他们甚至不会知道,因为他们不需要登录。当前端打开时,代码可以检查他们是否已经有记录,然后做出相应的响应,可能会拒绝他们访问,直到他们“联系管理员”,以防有人忘记将新员工添加到用户表中。
  • 所以Environ("USERNAME") 捕获打开数据库的人的Windows 用户名?如果是这种情况,我也许可以只使用确实需要编辑能力的用户列表,而不允许其他任何人使用。
  • 它捕获登录到打开数据库的计算机的用户的用户名。我还没有测试过多个用户登录同一台计算机并独立打开数据库的情况。办公室里的每个人都有自己的电脑。
  • 请注意,像这样的简单批处理文件会欺骗 Environ("USERNAME") : SET USERNAME=superuser // start "C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "C:\Users\neo\Documents\Database1.accdb"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
相关资源
最近更新 更多