Chapter3ProtectingtheData(2):分配列级权限
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39577861,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,任何人不得以原创形式发布,也不得已用于商业用途,本人不负责任何法律责任。 前一篇:http://b
原文出处: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的使用,避免过多使用最底层的权限设置而导致权限策略太复杂而无法管理或者权限交叉。
更多:
列级权限会导致权限体系的不一致性,在后续版本可能被移除,建议使用视图来实现这种需求。
推荐阅读
-
Chapter3ProtectingtheData(2):分配列级权限
-
Chapter3ProtectingtheData(2):分配列级权限
-
DB2 10新特性: RCAC基于行和列级别的权限控制
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(26)-权限管理系统-分配角色给用户
-
SQL Server 2008 R2 为用户权限分配的操作步骤
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色
-
Python练习题答案: *分配【难度:2级】--景越Python编程实例训练营,1000道上机题等你来挑战
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(26)-权限管理系统-分配角色给用户
-
SQL Server 2008 R2 为用户权限分配的操作步骤
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色