考虑设置:
我需要实施以下方案:
例如,我们有用户:
- John
- 欧文
John被分配到项目A,B,D。 欧文到B,D
当John登录时,他只能看到数据 与项目A,B,D有关。当欧文 登录他只能看到B,D
John和Owen可以同时访问该应用程序
后端的相关表格
我在databasedev.co.uk上遇到this solution,它基本上使用隐藏的表单来存储当前用户的详细信息,然后使用它来过滤其他表单上的数据。
所以这是我的问题:
这是推荐的解决方案吗?还有更好的选择吗?我以为我可以使用前端的表而不是隐藏的表格。
答案 0 :(得分:1)
编辑重新评论
我认为你没有理由不在后端维护一个用户表,用户可以用来过滤项目的项目连接表。
如果您使用网络名称(http://www.mvps.org/access/api/api0008.htm),则可以使用代码获取当前用户,可以将其存储到表单上的隐藏字段,这对于将表单设置为相关项目非常有用,或者您可以将名称存储到自定义数据库属性(http://wiki.lessthandot.com/index.php/Custom_Database_Properties_Creation_and_Use)
以下代码适用于查找已登录用户的数量。
您可以使用提供程序特定的ADO架构。您需要传递有效的连接,例如:
ADOUserList Currentproject.Connection
Public Sub ADOUserList(oConn As ADODB.Connection)
Dim rs As ADODB.Recordset
Set rs = oConn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
Debug.Print rs.GetString
rs.Close
End Sub
答案 1 :(得分:1)
我有一个类似的,如果稍微复杂一点的情况。就我而言,用户被分配到用户组,这些用户组对Access对象(表单,报表等)具有不同的权限。他们还拥有分配给他们的项目和首选项。表:
user
user_group
user_pref
project
user_project
但是,我仍然使用隐藏的表单(session
)来保存有关当前登录用户的会话信息。例如:user_id,user_name,已分配项目的子表单,首选项(例如“当前项目”) )。
最后,模块basSession包含get
或set
隐藏形式的任何会话信息所需的所有功能,例如gfSession_GetUserID()
。
HTH
答案 2 :(得分:0)
请注意,在您当前的设置中,无法使用“识别用户并基于此限制访问数据”的方法。如果所有数据都驻留在共享后端Access文件中,则用户只需打开后端数据库并浏览所有数据即可。实际限制用户访问数据的唯一方法是使用数据库服务器。
如果您想访问Access,我建议您为所有(重要)表创建查询,并在表单中使用这些查询。在查询中包含一个WHERE语句,该语句将输出限制为用户可以查看的内容。您可以通过在打开数据库时更改完整的SQL或在查询的WHERE部分中包含全局变量并将该变量设置为当前UserID来执行此操作。