在開始閱讀本文之前,請確保你已經閱讀過上一篇文章,文章地址:
簡介
在上一篇文章中,我對主體的概念做了全面的闡述。本篇文章接着講述主體所作用的安全對象以及所對應的權限。
理解安全對象(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)
總結
本文接着上篇文章講述了安全對象以及相應的權限。對於權限控制時,理解權限的繼承和權限的覆蓋會在設置權限時減少很多問題。