SQL SERVER2005 中的權限管理

SQL Server2005中權限管理的主要對象包括服務器登錄名服務器角色數據庫用戶(User)、數據庫角色(Role)、數據庫架構(Schema),搞清楚這些對象間的關係,對於理解SQL Server2005的權限管理有很大幫助。比如爲大型企業設計數據庫的時候必然考慮到角色劃分、權限劃分的問題。本文主要以AdventureWorks爲樣本數據庫進行分析,該數據可以從微軟官網下載,安裝非常方便。

首先談論一下服務器級別的兩個對象,服務器登陸名和服務器角色。
服務器登陸名即登錄服務器時所用的用戶名,依靠這個服務器登陸名對象,數據庫系統才能根據對象間的關係獲取相應的數據庫操作權限,因此可以把該對象看作權限樹的根部和起點。SQL Server支持兩種方式的登錄:Windows身份認證和SQL Server身份認證。SQL Server2005默認的是Windows身份認證,集成Windows系統的驗證模式,登錄過程中登錄名是確定的,不需要輸入密碼。SQL Server身份認證需要輸入登陸名和相應密碼,系統自動帶有一個具有高級權限的登錄名對象sa,其他對象可以通過TSQL語句創建。例如:create login Kelvin with Password = 'password' 執行後,數據庫中即產生了名爲Kelvin的服務器登錄名對象。 











上圖中選中的爲Windows身份方式登錄的用戶名,默認的登陸名一般是服務器名稱。

服務器角色:SQL Server提供一組固定的服務器角色,比如sysadmin、securityadmin等,通過將這些固定的服務器角色賦予不同的服務器登陸名對象,可以是實現服務器級別的權限管理。將服務器角色賦予登陸名對象的語句如下: exec sp_addsrvrolemember Kelvin, sysadmin ; exec sp_dropsrvrolemember Kelvin, sysadmin; 一個服務器登錄名對象可以擁有多個固定服務器角色權限,但是固定服務器角色不能被修改、添加和刪除。

值得注意的是,服務器角色主要是控制服務器端對請求數據庫資源的訪問權限,他允許拒絕服務器登陸名的訪問操作,但是在設置具體數據庫的管理和操作權限方面,服務器對象的權限設置粒度過大,因此要依靠數據庫級別的對象:數據庫用戶(User)、數據角色(Role)、數據庫架構(Schema),這三個對象是針對每一個數據庫實例的,因此可以對單個數據庫實例進行細化權限劃分。

對於擁有服務器角色sysadmin的登陸名對象,它可以SQL Server2005中做任何操作(由此可見服務器角色權限粒度之大)。但對那些沒有sysadmin角色的登陸名對象,它需要擁有一個能訪問特定數據庫實例的數據庫用戶名(User)以實現對該數據庫的操作。比如說爲登陸名Kelvin想要訪問AdventureWorks數據庫,但不具備sysadmin的服務器角色。那麼則在AdventureWorks數據庫中中創建一個名爲user_Kelvin的數據庫用戶。TSQL:USE AdventureWorks; GO; create user user_Kelvin for login Kelvin; 執行之後,用Kelvin登陸名登錄的用戶與AdventureWorks下的user_Kelvin用戶建立起了關聯。


而數據庫用戶(User)的權限來源則是下面的兩個對象:數據庫角色(Role)和數據庫架構(Schema)。通過在用戶中選定相應的角色和架構,我們可以較爲方便的實現數據庫中數據的分離、存取權限的分離等權限管理。
數據庫角色分爲固定數據庫角色和用戶創建的數據庫角色。固定數據庫角色是系統默認用於組織數據庫用戶權限的角色,包括db_datareader、db_ddladmin、db_owner等,這些角色都包含與其名稱相同的數據庫架構(Schema),比如db_datareader就默認只擁有名爲db_datareader的架構。用戶可以創建角色,並讓角色獲取相應的架構,最後將角色(Role)與數據庫用戶(User)建立起聯繫即可。 比如: Use AdventureWorks; exec sp_addrolemember db_datareader, user_Kelvin; 執行後user_Kelvin就擁有了讀取數據的權限(該權限爲db_datareader角色擁有)。
數據庫的架構應該是最小粒度的權限設置,既包括固定數據庫角色對應的數據庫架構,又可包括用戶自身定義的架構。固定數據庫角色對應架構主要涉及數據存取權限,比如db_datareader是允許讀取該數據庫中所有數據內容,db_datawriter即允許update、insert、delete語句等;用戶自定義的架構主要用於分離數據,比如AdventureWorks數據庫中擁有下列表:

對於只擁有Production架構的數據庫用戶來說,登錄Adventure數據庫只能看到前綴爲Production.的表,其他前綴的表隸屬於其他架構,對當前用戶就不可見了(除非擁有其他架構)。

綜上,服務器登陸名對象分別與服務器角色數據庫用戶直接關聯,而數據庫用戶數據庫角色數據庫架構直接聯繫,從而形成了整個數據庫結構的權限管理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章