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

Sql server 确定存储过程是否可以基于AD登录执行,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个存储过程,用于更新表中特定记录的数据。我有几个用户将使用此存储过程,但我只希望他们能够更新分配给他们的记录 要由存储过程更新的每个记录都有一个名为“UserID”的字段,该字段定义谁可以控制该记录。我还有一个映射表,它将active directory登录映射到用户ID 我使用的是Active Directory,因此SQL Server知道是谁在尝试执行存储过程。存储过程中是否有方法在另一个表中查找用户的active directory登录名,然后确定他们是否有权访问试图更新的记录?通

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

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


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

通过调用SYSTEM\u user并将其合并到更新行。

您可以通过调用SYSTEM\u user并将其合并到更新行的查询中,来找出进程中的当前用户。

我不是应用程序设计师,但表面上看,您的解决方案对我来说太复杂了

也就是说,您可以发出以下查询以获取当前执行存储过程的用户的Windows AD登录名。您可以使用此信息与映射表交叉引用,以确定AD帐户是否具有执行该操作所需的权限

SELECT SYSTEM_USER
请记住,这将返回当前正在执行的上下文的名称,因此请记住,可以使用“executeas”语句显式更改该名称

编辑

我想知道是否可以使用视图来限制给定广告帐户可见的数据。然后,存储过程逻辑可以将重点放在数据修改方面,而不是安全实现方面。使用视图控制数据访问还可以确保在需要时跨多个存储过程使用一致的安全访问方法,而不必在每个存储过程中实施安全检查

在撰写本文之后,Martin Smith提供的链接详细介绍了如何实施此解决方案:


总之,两者的结合是Microsoft建议您实施问题解决方案的方式。

我不是应用程序设计师,但表面上看,您的解决方案对我来说太复杂了

也就是说,您可以发出以下查询以获取当前执行存储过程的用户的Windows AD登录名。您可以使用此信息与映射表交叉引用,以确定AD帐户是否具有执行该操作所需的权限

SELECT SYSTEM_USER
请记住,这将返回当前正在执行的上下文的名称,因此请记住,可以使用“executeas”语句显式更改该名称

编辑

我想知道是否可以使用视图来限制给定广告帐户可见的数据。然后,存储过程逻辑可以将重点放在数据修改方面,而不是安全实现方面。使用视图控制数据访问还可以确保在需要时跨多个存储过程使用一致的安全访问方法,而不必在每个存储过程中实施安全检查

在撰写本文之后,Martin Smith提供的链接详细介绍了如何实施此解决方案:

总之,两者的结合是Microsoft建议您实施问题解决方案的方式。

本文有帮助吗

它建议采取以下步骤

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

它建议采取以下步骤

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