在 SQL Server 中授予行级权限 (ADO.NET)

某些方案中会要求更为细致地控制访问,而不仅仅是授予、撤消或拒绝对数据的权限。 例如,医院数据库应用程序可能会将患者信息存储在单个表中。 可能需要限制医生仅查看与他们自己的患者相关的信息。 在很多环境中(包括财务、法律、政府和军事应用程序)都存在类似的方案。 不过,SQL Server 并不支持实现行级安全性。 您必须在表中创建附加列以定义行筛选机制。

实现行级权限

行级权限用于在单个表中存储信息的应用程序。 每行均有一个定义区别性参数的列,如用户名、标签或其他标识符。 然后可以创建参数化存储过程,传入适当的值。 用户只能看到与所提供的值匹配的行。

下面的步骤说明如何基于用户名或登录名配置行级权限。

  • 创建表,添加用于存储名称的附加列。

  • 基于用户名列创建一个具有 WHERE 子句的视图。 这会将返回行限制为具有指定值的行。 使用内置函数之一指定数据库用户名或登录名。 这样就不必为不同的用户创建不同的视图。

    ' Returns the login identification name of the user.
    WHERE UserName = SUSER_SNAME()

    ' USER_NAME or CURRENT_USER Return the database user name.
    WHERE UserName = CURRENT_USER()
  • 基于视图而不是基表创建用于选择、插入、更新和删除数据的存储过程。 视图提供筛选器,它可限制返回或修改的行。

  • 对于插入数据的存储过程,使用视图的 WHERE 子句中指定的同一函数捕获用户名并将该值插入 UserName 列。

  • 拒绝 public 角色对表和视图的所有权限。 用户将不能从其他数据库角色继承权限,因为 WHERE 子句基于用户名或登录名而不基于角色。

  • 为数据库角色授予对存储过程的 EXECUTE 权限。 用户只能通过提供的存储过程访问数据。

外部资源

有关更多信息,请参见以下资源。

Implementing Row- and Cell-Level Security in Classified Databases Using SQL Server 2005(使用 SQL Server 2005 在分类数据库中实现行级和单元格级安全性),位于 SQL Server TechCenter 站点上。

说明如何使用行级和单元格级安全性来满足分类数据库的安全要求。

请参见

概念

SQL Server 中的应用程序安全机制方案 (ADO.NET)

使用 SQL Server 中的存储过程管理权限 (ADO.NET)

在 SQL Server 中编写安全动态 SQL (ADO.NET)

其他资源

保证 ADO.NET 应用程序的安全

SQL Server 安全性概述 (ADO.NET)