我们正在开发一个带有SQL Server后端的Access应用程序。我们有一个包含属于A,B或C部分的记录的表。用户也属于角色A,B或C.我们希望每个用户只能看到他们相应的部门记录,以及只有某些列。
我想到了两种方法,一种是针对每个角色进行不同的查询,然后根据用户的角色更改表单的源对象。但是,我不知道是否可以使用VBA从SQL SERVER中检索它(到目前为止我发现的所有VBA文档都非常缺乏)。
我认为另一个解决方案是在服务器上实现这个,但是我不知道T-SQL查询或视图如何只根据用户的角色获取所需的信息
有什么想法吗?
PS:我不能使用函数或存储过程。出于某种原因,我们提供的SQL Server已禁用它们,IT Ops不会启用它们(不知道背后的逻辑)。
答案 0 :(得分:1)
好吧,自从我发布这篇文章以来已经有一段时间了,但我会发布最终提出的解决方案。在这种情况下,VBA并不十分必要。它可以完美地与视图完成。
要检索用户角色,(内部)将表database_role_members与database_principals一起连接两次。在两个字段上按Id(来自database_principals)加入。有了这个,您将获得所有角色及其相应用户的列表。要获取查询数据库的用户的角色,只需添加一个where子句,检查用户名是否与USER_NAME函数对应。
然后,不允许这些角色访问我们要限制访问的表。相反,创建一个从该表中获取信息的视图,并添加一个where子句,该子句根据检索用户角色的查询从列中查找值。
通过此操作,您可以在访问视图时建立链接,并允许您仅查看与用户角色对应的记录。
虽然这种方法很简单,但它不允许更复杂的行级安全性。对于更强大的方法,检查以下链接可能很有用。
答案 1 :(得分:0)
您可以使用不同的模式创建相同的表,并为不同的模式分配用户权限。例如,您可以使用Accounting.Users和Warehouse.Users,而不是使用dbo.Users。将会计组中的用户分配给Accouting模式。或者如上所述,这些可以是从基础表中选择数据的模式中的视图。