我有一个存储过程可以更新表中特定记录的数据。我有几个用户将使用这个存储过程,但我只希望他们能够更新分配给它们的记录。
存储过程要更新的每个记录都有一个名为“UserID”的字段,用于定义谁可以控制记录。我还有一个映射表,它将活动目录登录映射到UserID。
我正在使用Active Directory,因此SQL Server知道谁正在尝试执行存储过程。在存储过程中是否有办法在另一个表中查找用户活动目录登录,然后确定他们是否有权访问试图更新的记录?
答案 0 :(得分:3)
您可以通过调用 SYSTEM_USER 并将其合并到更新行的查询中,找出当前用户在proc中的位置。
答案 1 :(得分:2)
我不是应用程序设计师,但从表面上看,您的解决方案对我来说听起来并不复杂。
也就是说,您可以发出以下查询以获取当前正在执行存储过程的用户的Windows AD登录名。您可以使用此信息与映射表交叉引用,以确定AD帐户是否具有执行操作所需的权限。
SELECT SYSTEM_USER
请记住,这会返回当前正在执行的上下文的名称,因此请记住,可以使用“Execute As”语句显式更改此名称。
修改强>:
我想知道是否可以使用视图来限制给定AD帐户可见的数据。然后,存储过程逻辑可以专注于数据修改方面,而不是安全实现。使用视图控制数据访问还可以确保在需要时跨多个存储过程使用一致的安全访问方法,而不必在每个存储过程中实现安全检查。
自撰写本文以来,Martin Smith提供的链接详细说明了如何实施此解决方案:
Granting Row-Level Permissions in SQL Server
总之,两者的结合是Microsoft建议您如何实施问题的解决方案。
答案 2 :(得分:2)
这篇文章有帮助吗? Granting Row-Level Permissions in SQL Server
建议采取以下步骤