Chapter 3 Protecting the Data(2):分配列級權限
來源:程序員人生 發布時間:2014-09-30 05:19:34 閱讀次數:3669次
原文出處: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
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈