Chapter 3 Protecting the Data(2):分配列级权限

时间:2022-05-12 14:33:05
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39577861,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349

未经作者同意,任何人不得以“原创”形式发布,也不得已用于商业用途,本人不负责任何法律责任。

前一篇:http://blog.csdn.net/dba_huangzj/article/details/39548665

前言:

SQL Server的权限是有层次的,一个用户有架构级别的权限,就有了架构内部所有对象的权限,除非使用了DENY权限单独移除。但是对象并不是层次中的最低级,可以把权限设置到列级别。但是列级权限会覆盖掉表上被GRANT的权限。

实现:

要实现分配列级权限,可以使用GRANT SELECT ON <对象>语句,并且加上所需的列,如:

GRANT SELECT ON OBJECT::dbo.Employee (EmployeeId, LastName, Firstname, email) TO HumanResourceAssistant;

这个语句会仅供HumanResourceAssistant数据库角色成员能读取dbo.Employee 表上的EmployeeId, LastName, Firstname, email这三列,表上的其他列将不能被查询。(该表上还有Birthdate和Salary列),那么下面的查询中,第一个语句可以执行但是第二个语句不能执行,因为它需要使用到Salary列:

--能执行
SELECT FirstName + ' ' + LastName as Employee
FROM dbo.Employee
ORDER BY LastName, FirstName;
--不能执行
SELECT FirstName + ' ' + LastName as Employee
FROM dbo.Employee
ORDER BY Salary DESC;

可以使用下面语句修改,使其可以查询全表的数据,但是仅能更新表上的三列:

GRANT SELECT ON OBJECT::dbo.Employee TO HumanResourceEmployee;
GRANT UPDATE ON OBJECT::dbo.Employee (LastName, Firstname, email) TO HumanResourceEmployee;

原理:

当用户尝试查询未被授权的列是,会收到230错误:

The SELECT permission was denied on the column 'Salary' of the object 'Employee', database 'HumanResource', schema 'dbo'.

但是要注意权限的修改,特别是对DENY的使用,避免过多使用最底层的权限设置而导致权限策略太复杂而无法管理或者权限交叉。

更多:

列级权限会导致权限体系的不一致性,在后续版本可能被移除,建议使用视图来实现这种需求。

下一篇:http://blog.csdn.net/dba_huangzj/article/details/39639365