确定存储过程是否可以基于AD登录执行

时间:2010-10-15 14:10:08

标签: sql-server stored-procedures

我有一个存储过程可以更新表中特定记录的数据。我有几个用户将使用这个存储过程,但我只希望他们能够更新分配给它们的记录。

存储过程要更新的每个记录都有一个名为“UserID”的字段,用于定义谁可以控制记录。我还有一个映射表,它将活动目录登录映射到UserID。

我正在使用Active Directory,因此SQL Server知道谁正在尝试执行存储过程。在存储过程中是否有办法在另一个表中查找用户活动目录登录,然后确定他们是否有权访问试图更新的记录?

3 个答案:

答案 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

建议采取以下步骤

  • 创建表格,添加一个额外的列来存储名称。
  • 创建一个具有基于用户名列的WHERE子句的视图。这将限制返回到具有指定值的行。使用其中一个内置函数指定数据库用户或登录名。这消除了为不同用户创建不同视图的需要。
  • 创建存储过程以根据视图而不是基表选择,插入,更新和删除数据。该视图提供了一个过滤器,用于限制返回或修改的行。
  • 对于插入数据的存储过程,使用视图的WHERE子句中指定的相同函数捕获用户名,并将该值插入UserName列。
  • 拒绝对公共角色的表和视图的所有权限。用户将无法继承其他数据库角色的权限,因为WHERE子句基于用户名或登录名,而不是基于角色。
  • 将存储过程的EXECUTE授予数据库角色。用户只能通过提供的存储过程访问数据。