在 SQL Server 中授予行级权限 (ADO.NET)
更新:November 2007
某些方案中会要求更为细致地控制访问,而不仅仅是授予、撤消或拒绝对数据的权限。 例如,医院数据库应用程序可能会将患者信息存储在单个表中。 可能需要限制医生仅查看与他们自己的患者相关的信息。 在很多环境中(包括财务、法律、政府和军事应用程序)都存在类似的方案。 不过,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)