原文:http://www.cnblogs.com/CareySon/archive/2012/04/12/SQL-Security-SecurableAndPermission.html
在開始閱讀本文之前,請確定你已經閱讀過上一篇文章,文章位址:
在上一篇文章中,我對主體的概念做了全面的闡述。本篇文章接着講述主體所作用的安全對象以及所對應的權限。
安全對象,是SQL Server 資料庫引擎授權系統控制對其進行通路的資源。通俗點說,就是在SQL Server權限體系下控制的對象,因為所有的對象(從伺服器,到表,到視圖觸發器等)都在SQL Server的權限體系控制之下,是以在SQL Server中的任何對象都可以被稱為安全對象。
和主體一樣,安全對象之間也是有層級,對父層級上的安全對象應用的權限會被其子層級的安全對象所繼承。SQL Server中将安全對象分為三個層次,分别為:
伺服器層級
資料庫層級
構架層級
這三個層級是從上到下包含的,如圖1所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUGOxIjZ3YWN1Q2Y5UWZ2ImY1YWO2UTZ5EmYmVWOkRGNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
圖1.安全對象層級之間的包含關系
圖2.伺服器層級的安全對象
圖3.資料庫和構架層級的安全對象
權限是連接配接主體和安全對象的紐帶。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語句進行權限控制就非常簡單了。使用GRANT語句進行授予權限,使用DENY語句限制權限,使用REVOKE語句收回之前對于權限的授予或者限制。
GRANT在MSDN的原型為:
對于GRANT語句的了解就像造句一樣 GRANT 某種權限 ON 安全對象類型::安全對象 TO 主體。如果指定了WITH GRANT OPTION,則被授予權限的主體可以授予别的主體同樣的權限。
對于DENY語句在MSDN中的原型和GRANT大同小異:
值得注意的是CASCADE選項表示拒絕主體對于安全對象的通路權限同時決絕主體授予其他主體對于安全對象的權限。
而REVOKE語句用于收回原來授予或拒絕某個主體對于安全對象的權限。REVOKE在MSDN中的原型如下:
一個進行權限控制的例子如下:
控制權限的時候需要注意如下幾點:
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組的成員可以為所欲為
本文接着上篇文章講述了安全對象以及相應的權限。對于權限控制時,了解權限的繼承和權限的覆寫會在設定權限時減少很多問題。