在開始閱讀本文之前,請確保你已經閱讀過上一篇文章,文章地址:
理解SQL Server中的許可權體系(上)----主體
簡介
在上一篇文章中,我對主體的概念做了全面的闡述。本篇文章接著講述主體所作用的安全性實體以及所對應的許可權。
理解安全性實體(Securable)
安全性實體,是SQL Server 資料庫引擎授權系統控制對其進行訪問的資源。通俗點說,就是在SQL Server許可權體系下控制的對象,因為所有的對象(從伺服器,到表,到視圖觸發器等)都在SQL Server的許可權體系控制之下,所以在SQL Server中的任何對象都可以被稱為安全性實體。
和主體一樣,安全性實體之間也是有層級,對父層級上的安全性實體應用的許可權會被其子層級的安全性實體所繼承。SQL Server中將安全性實體分為三個層次,分別為:
這三個層級是從上到下包含的,1所示:
圖1.安全性實體層級之間的內含項目關聯性
對於SQL Server對於層級的詳細劃分,可以參看MSDN(http://msdn.microsoft.com/zh-cn/library/ms190401.aspx)。SQL Server中全部的安全性實體2和圖3所示。
圖2.伺服器層級的安全性實體
圖3.資料庫和構架層級的安全性實體
理解許可權(Permission)
許可權是串連主體和安全性實體的紐帶。SQL Server 2008中,許可權分為權利與限制,分別對應GRANT語句和DENY語句。GRANT表示允許主體對於安全性實體做某些操作,DENY表示不允許主體對某些安全性實體做某些操作。還有一個REVOKE語句用於收回先前對主體GRANT或DENY的許可權。
在設定許可權時,尤其要注意許可權在安全性實體上的繼承關係。對於父安全性實體上設定的許可權,會被自動繼承到子安全性實體上。主體和安全性實體的層級關係4所示。
圖4.主體和安全性實體之間的層級關係
比如,我給予主體CareySon(登入名稱)對於安全性實體CareySon-PC(伺服器)的Select(許可權),那麼CareySon這個主體自動擁有CareySon-PC伺服器下所有的資料庫中表和視圖等子安全性實體的SELECT許可權。5所示。
圖5.主體對於安全性實體的許可權在層級上會繼承
此時,主體CareySon可以看到所有資料庫極其子安全性實體,6所示
圖6.主體對於安全性實體的許可權在層級上會繼承
使用T-SQL語句進行許可權控制
在理解了主體,安全性實體和許可權的概念之後,使用T-SQL語句進行許可權控制就非常簡單了。使用GRANT語句進行授予許可權,使用DENY語句限制許可權,使用REVOKE語句收回之前對於許可權的授予或者限制。
GRANT在MSDN的原型為:
GRANT { ALL [ PRIVILEGES ] } | permission [ ( column [ ,...n ] ) ] [ ,...n ] [ ON [ class :: ] securable ] TO principal [ ,...n ] [ WITH GRANT OPTION ] [ AS principal ]
對於GRANT語句的理解就像造句一樣 GRANT 某種許可權 ON 安全性實體類型::安全性實體 TO 主體。如果指定了WITH GRANT OPTION,則被授予許可權的主體可以授予別的主體同樣的許可權。
對於DENY語句在MSDN中的原型和GRANT大同小異:
DENY { ALL [ PRIVILEGES ] } | permission [ ( column [ ,...n ] ) ] [ ,...n ] [ ON [ class :: ] securable ] TO principal [ ,...n ] [ CASCADE] [ AS principal ]
值得注意的是CASCADE選項表示拒絕主體對於安全性實體的存取權限同時決絕主體授予其他主體對於安全性實體的許可權。
而REVOKE語句用於收回原來授予或拒絕某個主體對於安全性實體的許可權。REVOKE在MSDN中的原型如下:
REVOKE [ GRANT OPTION FOR ] { [ ALL [ PRIVILEGES ] ] | permission [ ( column [ ,...n ] ) ] [ ,...n ] } [ ON [ class :: ] securable ] { TO | FROM } principal [ ,...n ] [ CASCADE] [ AS principal ]
一個進行許可權控制的例子如下:
grant select--許可權 ON Schema::SalesLT--類型::安全性實體 to careyson--主體deny select--許可權 ON Schema::SalesLT--類型::安全性實體 to careyson--主體revoke select--許可權 ON Schema::SalesLT--類型::安全性實體 to careyson--主體
控制許可權的時候需要注意如下幾點:
- GRANT會移除主體作用於安全性實體上的DENY和REVOKE
- DENY和REVOKE移出主體作用於安全性實體上的GRANT
- REVOKE會移除主體作用於安全性實體上的DENY和GRANT
- 在高層級上的DENY會覆蓋任何子層級的GRANT。比如說,你對於Schema進行Deny,對其包含的表進行Grant,則表的GRANT會被Schema的Deny鎖覆蓋,7所示。
圖7.父層級的Deny覆蓋子層級的Grant
- 對於主體作用於高層級的GRANT會被其子Deny所覆蓋,還是上面的例子,我對於Schema進行Grant,對於表進行Deny,最後結果還是Deny,8所示。
圖8.子層級的Deny覆蓋父層級的Grant
- SQL Server不對sysadmin組的成員做任何許可權驗證操作。換句話說,sysadmin組的成員可以為所欲為
而對於何種的安全性實體可以進行何種對應許可權的GRANT,REVOKE,DENY,請參看MSDN(http://msdn.microsoft.com/zh-cn/library/ms191291.aspx)
總結
本文接著上篇文章講述了安全性實體以及相應的許可權。對於許可權控制時,理解許可權的繼承和許可權的覆蓋會在設定許可權時減少很多問題。