某些方案中会要求更为细致地控制访问,而不仅仅是授予、撤消或拒绝对数据的权限。 例如,医院数据库应用程序可能会将患者信息存储在单个表中。 可能需要限制医生仅查看与他们自己的患者相关的信息。 在很多环境中(包括财务、法律、政府和军事应用程序)都存在类似的方案。 不过,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 权限。 用户只能通过提供的存储过程访问数据。
以上内容转自:http://msdn.microsoft.com/zh-cn/library/bb669076.aspx